C#中的Const对象作为参数

时间:2011-11-23 01:45:16

标签: c# interface properties

在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; }
}

2 个答案:

答案 0 :(得分:3)

你可以添加set,它会正常工作:

public IValue Value { get; set; }

如果您有Foo,可以设置值,但如果您有IFoo,则可以设置值。与C ++案例类似,如果您有IFoo,则可以转换为Foo(只要对象实际为Foo),然后使用setter。

另一个选择是制作二传手protectedprivate

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;}
}