const-correctness的要点是能够提供用户无法更改或删除的实例的视图.编译器支持这一点,指出何时从const函数中断开constness,或者尝试使用const对象的非const函数.因此,如果不复制const方法,我可以在C#中使用具有相同目的的方法吗?
我知道不变性,但这并不能真正地将容器对象转移到一个例子.
C#:你可以这样做,以便方法参数通过引用传递一个对象但是只读吗?
例如:
void MyMethod(int x, int y, read-only MyObject obj)
Run Code Online (Sandbox Code Playgroud)
where obj是对象引用,但在方法期间无法修改此对象.
这可以用C#实现吗?
为什么我不能初始化初始化程序中的只读变量?以下内容不起作用:
class Foo
{
public readonly int bar;
}
new Foo { bar=0; }; // does not work
Run Code Online (Sandbox Code Playgroud)
这是由于CLR的某些技术限制吗?
编辑
我知道它new Foo { bar=0; }是相同的new Foo().bar=0;,但是CLR强制执行"readonly",还是仅仅是编译器限制?
我将简要介绍一下我熟悉使用C实现的内容.我认为关注的是如何使用数据,而不是我在示例中使用它做的事情:)
typedef struct
{
const char *description;
uint32_t colour_id;
uint32_t quantity;
} my_data_t;
const my_data_t ref_data[] =
{
{"Brown Bear", 0x88, 10},
{"Blue Horse", 0x666, 42},
{"Purple Cat", 123456, 50},
};
void show_animals( void )
{
my_data_t *ptr;
ptr = &ref_data[2];
console_write("Animal: %s, Colour: 0x%8X, Num: %d",
ptr->description,
ptr->colour_id,
ptr->quantity);
}
Run Code Online (Sandbox Code Playgroud)
所以我正在寻找有关如何在C#中实现类似数据表或参考数据的建议.我已经掌握了更高层次的东西,但我还没有处理任何表格驱动的数据方法.
举个例子,我在C#中尝试做的是让一个组合框允许从描述字段中进行选择,而颜色id和数量可能用于更新只读框.
这是一个非常简单的例子,但是如果我能确定一个实现它的好方法,我可以推断出我正在做的事情.
在过去使用C++编程时,我记得我们可以在方法中创建一个常量引用/指针参数.
如果我的记忆是正确的,则下面的意思是该方法不能改变参考,并且参考本身是一个常量参考.
void DisplayData(const string &value) const
{
std::count << value << endl;
}
Run Code Online (Sandbox Code Playgroud)
C#中是否存在类中方法的等价物?
我问的原因是,我试图通过引用传递一个对象(速度),同时不希望任何人改变它.
我理解 ref 意味着当方法返回时提交的引用可能指向一个完全不同的对象。
然而,我喜欢 ref 修饰符的一点是,开发人员立即知道在方法返回时他输入的内容可能会有所不同,因为调用方也需要 ref 修饰符。
从假设的 ORM 中采用一种简单的方法:
public Boolean AddItem(Entity someEntity)
{
try
{
// Add item to database
// Get Id of entity back from database
someEntity.Id = *returnedId*;
return true;
}
catch (DBException ex)
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
该方法的任何调用者可能不知道他们的实体已通过调用该方法进行更新。然而,将 someEntity 设为 ref 参数,它向开发人员表明他们提交的参数将有所不同,然后他们知道深入研究文档/代码以找出它是如何更改的,如果没有修饰符,他们可能从未想过这样做。
我知道这稍微滥用了 ref 修饰符,因为上面的示例中实际上并不需要它,但是以这种方式使用它实际上会给我带来任何问题吗?
遵循(不正确/危险)代码
class EvilClass
{
protected int x;
public EvilClass(int x)
{
this.x = x;
}
public override bool Equals(Object obj)
{
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
{
return false;
}
else
{
EvilClass p = (EvilClass)obj;
p.x = 42;
return (x == p.x);
}
}
public override int GetHashCode()
{
return (x << 2);
}
public override string ToString()
{
return String.Format("EvilClass({0})", x);
}
}
void Main()
{
var e1 = new EvilClass(1);
var e2 = new …Run Code Online (Sandbox Code Playgroud)