[英]Const Objects in C# as Parameter
在C ++中,可以将const对象传递给函数。 这迫使代码将该对象视为“只读”(忽略了可以使用强制类型转换常量性的事实)。 我正在尝试使用C#执行相同的操作。 我有一个用户将实现的接口。 其中一种方法将被赋予一个对象作为参数。 我如何在方法范围内使对象为“ const”,否则为可变对象。
解决方案:接口。 我创建一个接口,其中对属性唯一可用的操作是“ get”。
public interface IVal { ... }
public interface IFoo
{
IVal Val { get; }
}
public class Foo : IFoo
{
public IVal Val { get; }
}
我通过界面,一切都很棒。 但是,在我的具体课程中,我希望有一个“设置”。 这将允许我设置一个具体的类Value。 我的具体班级怎么样?
我当时正在考虑使用“内部”关键字。 我读到它在您自己的程序集中公开了代码的方法/属性。 这是我的答案吗?
编辑:为了更好地说明这一点,我添加了一个会自动为我投射的二传手。 但是,对于每个属性,这是很多重复的代码:
private Val _val;
public IVal Val
{
get { return this._val; }
set { this._val = value as Val; }
}
您可以添加set
,它将正常工作:
public IValue Value { get; set; }
这样,如果您具有Foo
,则可以设置该值,但如果您具有IFoo
,则不能设置。 与C ++情况类似,如果您具有IFoo
,则可以IFoo
为Foo
(只要对象实际上是Foo
),然后使用setter。
另一种选择是使设置器protected
或private
:
public IValue Value { get; private set; }
这使您可以确保只有此类(或在protected
的情况下为继承的类)中的代码才能设置属性。
关于internal
:是的,它仅将成员公开给同一程序集(和朋友程序集)中的代码。 但这并不经常使用。 使用的(并且有用的)是内部类型,如果您不指定该类为public
,那么它甚至是默认类型。
这可以帮助您解决问题。 如果将Foo
internal
设置为,则即使使用强制转换,其他程序集中具有IFoo
也无法设置该属性。
当然,代码可以始终使用反射来设置属性。 但是大多数时候您不必担心。
你可以做类似的事情
public class ReadonlyTestClass {
private readonly object _name;
public ReadonlyTestClass(object name) {
_name = name;
}
public object Name {get { return _name; }}
}
要么
public class ReadonlyTestClass {
public ReadonlyTestClass(object name) {
this.Name = name;
}
public object Name {get; private set;}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.