首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#的只读("const"-like)函数参数

C#的只读("const"-like)函数参数
EN

Stack Overflow用户
提问于 2010-09-30 07:08:51
回答 2查看 20.3K关注 0票数 21

我来自C++背景,习惯于将const关键字插入到函数定义中,以只读值形式传递对象。然而,我发现这在C#中是不可能的(如果我错了,请纠正我)。经过谷歌搜索,我得出的结论是,创建只读对象的唯一方法是编写一个只具有“get”属性的接口,并将其传递给只读对象。我得说很优雅。

代码语言:javascript
复制
public interface IFoo
{
  IMyValInterface MyVal{ get; }
}

public class Foo : IFoo
{
  private ConcreteMyVal _myVal;

  public IMyValInterface MyVal
  {
    get { return _myVal; }
  }
}

我会把它传递给:

代码语言:javascript
复制
public void SomeFunction(IFoo fooVar)
{
  // Cannot modify fooVar, Excellent!!
}

这很好。然而,在我的其余代码中,我想正常地修改我的对象。向接口添加“set”属性将打破我的只读限制。我可以向Foo (而不是IFoo)添加一个“set”属性,但是签名需要一个接口而不是一个具体的对象。我就得做些选角了。

代码语言:javascript
复制
// Add this to class Foo. Might assign null if cast fails??
set { _myVal = value as ConcreteMyVal; }

// Somewhere else in the code...
IFoo myFoo = new Foo;
(myFoo as Foo).MyFoo = new ConcreteMyVal();

有没有一种更好的方法来复制const或只读函数参数,而无需添加另一个属性或函数?

EN

回答 2

Stack Overflow用户

发布于 2010-09-30 07:21:31

首先,您是正确的:您不能将const或类似的关键字应用于C#中的参数。

但是,您可以使用接口来执行这些操作。接口的特殊之处在于,制作一个仅涵盖功能集特定部分的接口是非常有意义的。例如,想象一个堆栈类,它实现了IPopable和IPushable。如果通过IPopable接口访问实例,则只能从堆栈中删除条目。如果通过IPushable接口访问实例,则只能向堆栈中添加条目。您可以通过这种方式使用接口来获得与您所要求的内容相似的内容。

票数 3
EN

Stack Overflow用户

发布于 2010-09-30 07:46:24

首先考虑Timwi的答案。但作为第二种选择,您可以这样做,使其更像C CONST关键字。

默认情况下,引用类型(对象)参数为IN参数。但是因为它们是引用,所以它们的方法副作用和属性访问都是在方法外部对对象进行的。对象不需要被传递出去。它仍然被该方法修改过。

但是,默认情况下,值类型(结构)参数也是in,并且不能对传入的元素产生副作用或修改属性。取而代之的是,在进入方法之前,它在写入时被复制。当方法超出作用域(方法的末尾)时,方法内部对它的任何更改都会失效。

不要仅仅为了满足这种需要而将类更改为structs。这不是个好主意。但是如果它们应该是结构体,现在你就知道了。

顺便说一句,一半的编程社区没有正确地理解这个概念,但他们认为他们理解了(实际上,我在几本书中发现了关于C#中参数方向的不准确之处)。如果你想对我的陈述的准确性发表评论,请仔细检查,以确保你知道你在说什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3826542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档