如何创建具有只读对象参数的方法?
public class Person
{
public string Name;
}
public void RunMe(Person p)
{
p.Name = "XXXX";
}
var p = new Person();
p.Name = "YYYY";
RunMe(p);
Console.WriteLine(p.Name); // "XXXX"
上面的代码导致此人的姓名为“XXXX”。我想阻止RunMe
方法更改person的属性。
5条答案
按热度按时间wyyhbhjk1#
您可以使用接口来限制访问。传递接口而不是具体对象作为方法的参数也更好。
然后用这样的方法
bvjxkvbb2#
方法是通过
get
和set
访问器,只是不要定义集合:这将创建一个属性,您可以将其完全视为用于您的目的的普通字段。下面的属性稍微复杂一点,使用方法来设置一个backing字段,您可以在msdn上了解到
如果你只需要设置一次属性,那么将
set
定义为private,并将参数传递给构造函数:mzaanser3#
您似乎希望以某种方式锁定该成员。一个选项是使“set”依赖于另一个成员,如下所示:
编辑:使锁永久化的另一种方法。
编辑:还有一种锁的方法,用钥匙。
如果尝试使用错误的密钥对象进行解锁,您可以根据需要抛出异常。
3pvhb19x4#
第一次设置属性后描述的行为如下:
这不是一个好的做法。你为属性创建了意外的行为(如果这是一个公共类)。任何消费程序集都不能查看get和set方法的主体,因此会期望set方法以某种方式(设置值)运行。
这种行为应该放在一个单独的集合方法中。通过这种方式,您可以查看它是否更改,如果需要,可以抛出异常,或者如果更改,则返回true。然后,您仍然可以使用属性来获取值。
vtwuwzda5#
C#中的类是引用类型,所以如果
Person
是class
,就没有办法做你想做的事情。您可以将其设置为值类型(通过将其设置为
struct
),在这种情况下,将传入对象的副本,但这可能会影响程序中的其他一些点,因此如果您这样做,请谨慎。