在C ++中,您可以将一个const对象传递给函数。这会强制代码将该对象视为“只读”(忽略使用强制转换可以剥离常量的事实)。我正在尝试用C#做同样的事情。我有一个用户将实现的界面。其中一种方法将被赋予一个对象作为参数。如何在方法范围内使对象'const',否则变为可变。
解决方案:接口。我创建了一个界面,其中属性上唯一可用的操作是'get'。
public interface IVal { ... }
public interface IFoo
{
IVal Val { get; }
}
public class Foo : IFoo
{
public IVal Val { get; }
}
我通过界面传递,一切都很棒。但是,在我的具体课程中,我希望有一套“套装”。它允许我设置一个具体的类值。我的具体课程怎么样?
我在考虑使用'internal'关键字。我读到它将方法/属性暴露给您自己的程序集中的代码。这是我的答案吗?
编辑:为了更好地说明这一点,我添加了一个自动为我投射的二传手。但是,对于每个属性,这是很多重复代码:
private Val _val;
public IVal Val
{
get { return this._val; }
set { this._val = value as Val; }
}
答案 0 :(得分:3)
你可以添加set
,它会正常工作:
public IValue Value { get; set; }
如果您有Foo
,可以设置值,但如果您有IFoo
,则可以设置值。与C ++案例类似,如果您有IFoo
,则可以转换为Foo
(只要对象实际为Foo
),然后使用setter。
另一个选择是制作二传手protected
或private
:
public IValue Value { get; private set; }
这使您可以确保只有此类中的代码(或protected
中的继承类)才能设置属性。
关于internal
:是的,它只将成员暴露给同一程序集(和朋友程序集)中的代码。但这并不经常使用。使用(和有用)的是内部类型,如果您没有指定该类是public
,则它甚至是默认类型。
这可以帮助您解决问题。如果您Foo
internal
,则其他程序集中IFoo
的方法将无法设置属性,即使进行转换也是如此。
当然,代码总是可以使用反射来设置属性。但是大部分时间你都不应该担心。
答案 1 :(得分:1)
你可以做类似的事情
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;}
}