我来自C++背景,习惯于将const
关键字插入到函数定义中,以只读值形式传递对象。然而,我发现这在C#中是不可能的(如果我错了,请纠正我)。经过谷歌搜索,我得出的结论是,创建只读对象的唯一方法是编写一个只具有“get”属性的接口,并将其传递给只读对象。我得说很优雅。
public interface IFoo
{
IMyValInterface MyVal{ get; }
}
public class Foo : IFoo
{
private ConcreteMyVal _myVal;
public IMyValInterface MyVal
{
get { return _myVal; }
}
}
我会把它传递给:
public void SomeFunction(IFoo fooVar)
{
// Cannot modify fooVar, Excellent!!
}
这很好。然而,在我的其余代码中,我想正常地修改我的对象。向接口添加“set”属性将打破我的只读限制。我可以向Foo
(而不是IFoo
)添加一个“set”属性,但是签名需要一个接口而不是一个具体的对象。我就得做些选角了。
// 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
或只读函数参数,而无需添加另一个属性或函数?
发布于 2010-09-30 07:21:31
首先,您是正确的:您不能将const或类似的关键字应用于C#中的参数。
但是,您可以使用接口来执行这些操作。接口的特殊之处在于,制作一个仅涵盖功能集特定部分的接口是非常有意义的。例如,想象一个堆栈类,它实现了IPopable和IPushable。如果通过IPopable接口访问实例,则只能从堆栈中删除条目。如果通过IPushable接口访问实例,则只能向堆栈中添加条目。您可以通过这种方式使用接口来获得与您所要求的内容相似的内容。
发布于 2010-09-30 07:46:24
首先考虑Timwi的答案。但作为第二种选择,您可以这样做,使其更像C CONST关键字。
默认情况下,引用类型(对象)参数为IN参数。但是因为它们是引用,所以它们的方法副作用和属性访问都是在方法外部对对象进行的。对象不需要被传递出去。它仍然被该方法修改过。
但是,默认情况下,值类型(结构)参数也是in,并且不能对传入的元素产生副作用或修改属性。取而代之的是,在进入方法之前,它在写入时被复制。当方法超出作用域(方法的末尾)时,方法内部对它的任何更改都会失效。
不要仅仅为了满足这种需要而将类更改为structs。这不是个好主意。但是如果它们应该是结构体,现在你就知道了。
顺便说一句,一半的编程社区没有正确地理解这个概念,但他们认为他们理解了(实际上,我在几本书中发现了关于C#中参数方向的不准确之处)。如果你想对我的陈述的准确性发表评论,请仔细检查,以确保你知道你在说什么。
https://stackoverflow.com/questions/3826542
复制相似问题