我在想是否有一种方法可以仅将c#类成员的访问范围限定于get/set实现,以减少我意外直接访问它们的机会。类似于private但仅允许get/set访问它,我考虑将每个变量都包装在自己的类中,但这似乎对我寻找的限制来说太过杀鸡焉用牛刀了。谢谢
我在想是否有一种方法可以仅将c#类成员的访问范围限定于get/set实现,以减少我意外直接访问它们的机会。类似于private但仅允许get/set访问它,我考虑将每个变量都包装在自己的类中,但这似乎对我寻找的限制来说太过杀鸡焉用牛刀了。谢谢
您可以在字段中添加[Obsolete("使用属性")]
,并通过编写#pragma warning disable 618
来抑制属性中的警告。
不,很遗憾没有。我猜想你可能需要像这样的东西:
// Not actually valid C#!
public string Name
{
// Only accessible within the property
string name;
get { return name; }
set
{
if (value == null)
{
throw new ArgumentNullException();
}
name = value;
}
}
我之前也想过类似的事情,但很遗憾这是不可能的 :(
这是不可能的。唯一的访问修饰符包括private
、internal
、protected
、protected internal
和public
,但没有一个适合此情况。
然而,如果您使用自动属性,那么当然只能通过get和set来访问它。
如果您在访问器中不需要执行任何操作,请使用自动实现属性。
我猜您很可能确实想要执行操作,这就是为什么您想要确保使用属性而不是后备字段的原因。
在这种情况下,请考虑以下内容:
我相信我可能已经找到了一个可能的解决方法,而且它非常简单。然而,这个“解决方案”可能有点太聪明了。也许明天我会进行一些基准测试。问题是目前它也被限制在每个使用它的地方,也许通过使用泛型可以将其限制。
它利用了lambda始终具有相同的支持方法这一事实。通过将lambda传递给静态构造函数,静态对象可以跟踪此唯一的“作用域”并将变量链接到它。有关此实现的更多详细信息可以在此处找到。
用法:
class LocalTestClass
{
public int StaticTest( int setValue )
{
Local<int> test = Local<int>.Static( () => { } );
int before = test.Value;
test.Value = setValue;
return before;
}
public int InstanceTest( int setValue )
{
Local<int> test = Local<int>.Instance( () => this );
int before = test.Value;
test.Value = setValue;
return before;
}
}
[TestMethod]
public void LocalStaticTest()
{
LocalTestClass instance1 = new LocalTestClass();
LocalTestClass instance2 = new LocalTestClass();
instance1.StaticTest( 10 );
Assert.AreEqual( 10, instance2.StaticTest( 20 ) );
Assert.AreEqual( 20, instance1.StaticTest( 30 ) );
}
[TestMethod]
public void LocalInstanceTest()
{
LocalTestClass instance1 = new LocalTestClass();
LocalTestClass instance2 = new LocalTestClass();
instance1.InstanceTest( 10 );
Assert.AreEqual( 10, instance1.InstanceTest( 20 ) );
instance2.InstanceTest( 50 );
Assert.AreEqual( 20, instance1.InstanceTest( 30 ) );
}
这个类:
public class Local<TValue>
{
static readonly Dictionary<object, object> StaticScope
= new Dictionary<object, object>();
static readonly Dictionary<object, Dictionary<object, object>> InstanceScope
= new Dictionary<object, Dictionary<object, object>>();
public TValue Value { get; set; }
private Local() { }
public static Local<TValue> Static( Action scope )
{
if ( !StaticScope.ContainsKey( scope ) )
{
Local<TValue> newInstance = new Local<TValue>();
StaticScope.Add( scope, newInstance );
}
return StaticScope[ scope ] as Local<TValue>;
}
public static Local<TValue> Instance<TScope>( Func<TScope> scope )
{
object instance = scope();
if ( !InstanceScope.ContainsKey( instance ) )
{
InstanceScope.Add( instance, new Dictionary<object, object>() );
if ( !InstanceScope[ instance ].ContainsKey( scope ) )
{
Local<TValue> newInstance = new Local<TValue>();
InstanceScope[ instance ].Add( scope, newInstance );
}
}
return InstanceScope[ instance ][ scope ] as Local<TValue>;
}
}