C#中的常量对象作为参数 在C++中,可以将函数传递给const对象。这迫使代码将该对象视为“只读”(忽略可以使用强制类型转换去除常量的事实)。我正试图用C#做同样的事情。我有一个用户将实现的界面。其中一个方法将被赋予一个对象作为参数。如何使对象“const”在方法的范围内,否则是可变的

C#中的常量对象作为参数 在C++中,可以将函数传递给const对象。这迫使代码将该对象视为“只读”(忽略可以使用强制类型转换去除常量的事实)。我正试图用C#做同样的事情。我有一个用户将实现的界面。其中一个方法将被赋予一个对象作为参数。如何使对象“const”在方法的范围内,否则是可变的,c#,interface,properties,C#,Interface,Properties,解决方案:接口。我创建了一个接口,其中属性上唯一可用的操作是“get” public interface IVal { ... } public interface IFoo { IVal Val { get; } } public class Foo : IFoo { public IVal Val { get; } } 我路过界面,一切都很奇妙。然而,在我的具体课程中,我希望有一套可用的。它将允许我设置一个具体的类值。我的混凝土课看起来怎么样 我在考虑使用“内部”关键

解决方案:接口。我创建了一个接口,其中属性上唯一可用的操作是“get”

public interface IVal { ... }


public interface IFoo
{
    IVal Val { get; }
}

public class Foo : IFoo
{
    public IVal Val { get; }
}
我路过界面,一切都很奇妙。然而,在我的具体课程中,我希望有一套可用的。它将允许我设置一个具体的类值。我的混凝土课看起来怎么样

我在考虑使用“内部”关键字。我听说它向您自己的程序集中的代码公开了方法/属性。这是我的答案吗

编辑:为了更好地说明这一点,我添加了一个setter,它会自动为我进行转换。但是,对于每个属性,这是大量重复代码:

private Val _val;
public IVal Val
{
    get { return this._val; }
    set { this._val = value as Val; }
}

只需添加
集合
,即可正常工作:

public IValue Value { get; set; }
这样,如果有
Foo
,则可以设置该值,但如果有
IFoo
,则不能设置该值。与C++的情况类似,如果你有<代码> IFoo <代码>,你可以将它转换成<代码> Foo(只要对象实际上是<代码> Foo),然后使用SETTER。 另一个选项是使setter
受保护
专用

public IValue Value { get; private set; }
这允许您确保只有此类中的代码(或在
受保护的情况下继承的类)可以设置属性

关于
internal
:是的,它仅向同一程序集中(和友元程序集中)的代码公开成员。但这并不经常使用。使用的(和有用的)是内部类型,如果不指定该类为
public
,则它甚至是默认类型

这可以帮助你解决你的问题。如果将
Foo
设置为internal
,则其他程序集中具有
IFoo
的方法将无法设置属性,即使使用强制转换


当然,代码总是可以使用反射来设置属性。但大多数时候你不必担心这一点。

你只需添加
集,它就可以正常工作了:

public IValue Value { get; set; }
这样,如果有
Foo
,则可以设置该值,但如果有
IFoo
,则不能设置该值。与C++的情况类似,如果你有<代码> IFoo <代码>,你可以将它转换成<代码> Foo(只要对象实际上是<代码> Foo),然后使用SETTER。 另一个选项是使setter
受保护
专用

public IValue Value { get; private set; }
这允许您确保只有此类中的代码(或在
受保护的情况下继承的类)可以设置属性

关于
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 {
 private readonly object _name;
 public ReadonlyTestClass(object name) {
   _name = name;
 }
 public object Name {get { return _name; }}
}


如果我要为此设置一个值,我必须转换到接口。this.Value=新值();导致错误,迫使我在每次分配时执行强制转换。这是我最大的抱怨,有更好的方法吗?我得到错误“无法隐式地从Val转换为IVal…”如果我要设置一个值,我必须转换到接口。this.Value=新值();导致错误,迫使我在每次分配时执行强制转换。这是我最大的抱怨,有没有更好的方法呢?我得到了一个错误“无法隐式地从Val转换到IVal…”我希望“set”在类之外可以用于我的其他类。我希望它对其他人的类保持隐藏。我希望“set”在类外对我的其他类可用。我希望它对其他人的类保持隐藏。拥有这样的二传手可能是个坏主意。如果我试图将其设置为非
Val
,它将自动将其设置为
null
。这不是大多数人所期望的。你可能应该决定你是想要
Val
还是
IVal
并坚持下去。拥有这样一个setter可能是个坏主意。如果我试图将其设置为非
Val
,它将自动将其设置为
null
。这不是大多数人所期望的。您可能应该决定是要
Val
还是
IVal
,并坚持到底。