C#和只读引用类型(例如,数据表)
假设我有以下C类: 对于引用类型,C#和只读引用类型(例如,数据表),c#,.net,C#,.net,假设我有以下C类: 对于引用类型,readonly的含义是什么?我刚刚实现了这段代码,用户可以修改datatable 如何防止用户写入或修改我的数据表(或任何对象)?即,仅读取访问权限。显然,在这里使用属性没有帮助 Readonly意味着您不能重新分配变量-例如,稍后您不能将新的数据表分配给dt 至于将对象本身设置为只读,这完全取决于对象本身。没有使对象不可变的全局约定 我没有看到使用.NET的DataTable实现这一点的任何具体方法,但有一些选项是 确保用户在数据库本身中没有修改权限(最安全
readonly
的含义是什么?我刚刚实现了这段代码,用户可以修改datatable
如何防止用户写入或修改我的数据表(或任何对象)?即,仅读取访问权限。显然,在这里使用属性没有帮助 Readonly意味着您不能重新分配变量-例如,稍后您不能将新的数据表分配给dt 至于将对象本身设置为只读,这完全取决于对象本身。没有使对象不可变的全局约定 我没有看到使用.NET的DataTable实现这一点的任何具体方法,但有一些选项是
您可以创建这样的类:
class MyClass
{
private DataTable dt = new DataTable();
public MyClass()
{
//initialize your table
}
//this is an indexer property which make you able to index any object of this class
public object this[int row,int column]
{
get
{
return dt.Rows[row][column];
}
}
/*this won't work (you won't need it anyway)
* public object this[int row][int col]*/
//in case you need to access by the column name
public object this[int row,string columnName]
{
get
{
return dt.Rows[row][columnName];
}
}
}
然后像下面的例子一样使用它:
//in the Main method
MyClass e = new MyClass();
Console.WriteLine(e[0, 0]);//I added just one entry in the table
当然,如果你写了这份声明
e[0,0]=2;
它将产生类似于以下内容的错误:属性或索引器MyNameSpace.MyClass.this[int,int]无法分配给--它是只读的。只读意味着数据表将是一个运行时常量,而不是编译时常量在这里,您可以找到问题的答案,也可以找到用户如何更新/更改代码背后返回的数据,除非您允许。。也许你需要修复任何这样做的代码,或者更好地解释你到底想达到什么目的……我已经在谷歌上搜索过了,我不知道如何达到我想要的结果。我只想让用户对这个数据表和其他对象有读取权限。你是什么意思。。创建DataTable对象的实例。。sooooo。。。。。你在那里做什么。。你没有展示你正在尝试的AjeVeleT的东西,比如说类似C++的const方法。我想你还是不明白我的问题。我想我已经解释得很清楚了。返回给类的用户a,但是您必须小心,就像您的数据表(或您试图使其成为“只读”的任何其他引用类型)一样保存其中的引用类型(如果是浅层副本,则仍然可以修改这些引用类型),而这适用于保存其自身状态的对象,但不太可能在此处工作,因为DataTable将向数据库发送更新。DataTable未连接到任何数据库。无论如何,这是一个大问题。返回
dt.Copy()
似乎是一个代价高昂的解决方案。C不是有C++的CONST方法吗?也就是说,用户只允许对只读变量/引用类型调用const方法。@sapito no,C#没有任何这样的构造。如果你想要这个特性,你需要使用托管C++(它仍然不能用于DATAID,因为我认为它没有任何声明的方法)。你的客户需要与DATAATE完全相同的接口吗?另一种解决方案是在datatable周围放置一个不允许写入的包装器,然后返回该包装器。我不知道有什么想法,但根据你客户的要求,你自己的想法可能并不难。谢谢。我可以考虑在稍后的阶段实施这一点。目前,该库的大多数用户都希望使用DataTable接口。即使这不是必须的。@sapito在你的问题上花点力气,这样他们就不会被否决。但是引用是“常量”,你仍然可以修改数据表的内容——这是OP想要阻止的。
e[0,0]=2;