我认为它不被使用,原因如下:
Coordinate
代替float[]
,Money
代替decimal
,Serialized
代替byte[]
等。 - Stefan SteineggerObsolete
属性,如果属性有自定义消息,则为CS0618。[Obsolete("Please don't touch the backing field!")]
private int _backingField;
public int YourProperty
{
#pragma warning disable 612, 618
get { return _backingField; }
set { _backingField = value; }
#pragma warning restore 612, 618
}
Obsolete("Message", true)
",那么C#将拒绝编译#pragma
块内的内容。#pragma
只会禁用警告,而不是错误。 - LukeH目前没有内置的方法可以实现您想要的功能,但从事情的声音来看,您需要在类和该值之间加入另一层抽象。
创建一个单独的类,并将项目放入其中,然后您的外部类包含新类,只能通过其属性访问它。
不,这是不可能的。我自己非常希望有这样一个功能,类似于:
public string Name
{
private string name; // Only accessible within the property
get { return name; /* Extra processing here */ }
set { name = value; /* Extra processing here */ }
}
我大约5年前在C#新闻组中首次提出了这个建议......但我不指望会实现它。
需要考虑序列化等方面的各种问题,但我仍然认为这很好。不过,我更希望首先实现自动实现的只读属性......
public string Name { get; }
这样的?那会是怎样的工作方式呢? - Blorgbeardpublic string Name { get; private readonly set; }
这种语法,虽然有些冗长但意图更加清晰。 - ShuggyCoUk您可以通过在构造函数(或其他初始化函数)中使用局部变量的闭包来实现此操作。但是,与辅助类方法相比,这需要更多的工作。
class MyClass {
private Func<Foo> reallyPrivateFieldGetter;
private Action<Foo> reallyPrivateFieldSetter;
private Foo ReallyPrivateBackingFieldProperty {
get { return reallyPrivateFieldGetter(); }
set { reallyPrivateFieldSetter(value); }
}
public MyClass() {
Foo reallyPrivateField = 0;
reallyPrivateFieldGetter = () => { return reallyPrivateField; }
reallyPrivateFieldSetter = v => { reallyPrivateField = v; };
}
}
我怀疑底层字段类型 Foo
需要是一个引用类,这样两个闭包才能在同一个对象上创建。
public class A
{
class FieldsForA
{
private int number;
public int Number
{
get
{
//TODO: Extra logic.
return number;
}
set
{
//TODO: Extra logic.
number = value;
}
}
}
FieldsForA fields = new FieldsForA();
public int Number
{
get{ return fields.Number;}
set{ fields.Number = value;}
}
}
它只提供了一定程度的障碍。访问私有后备字段的根本问题仍然存在于嵌套类中。但是,类A内部的代码无法访问FieldForA的私有字段,必须通过公共属性进行访问。
在C#中没有这样的规定。
然而,我会给私有变量取不同的名字(例如 m_something 或只是 _something),这样在使用时更容易找到它。
Dictionary<string,object> mPropertyBackingStore = new Dictionary<string,object> ();
public PropertyThing MyPropertyThing
{
get { return mPropertyBackingStore["MyPropertyThing"] as PropertyThing; }
set { mPropertyBackingStore["MyPropertyThing"] = value; }
}
define a custom attribute say OnlyAccessFromProperty
write your code like
[OnlyAccessFromProperty(Name)]
String name
Name
{
get{return name;}
}
etc …
Then write a custom rule for FxCop
(or another checker)
Add FxCop
to your build system so if your custom rule find an error the build is failed.
我们是否需要一组标准的自定义规则/属性来强制执行常见的设计模式,而无需扩展C#?
C#没有这个语言特性。但是,您可以依靠命名约定,类似于根本没有私有属性的语言。使用_p_
前缀来命名更私有的变量名称,这样您就可以确信不会意外输入它。