C#和只读引用类型(例如,数据表)

C#和只读引用类型(例如,数据表),c#,.net,C#,.net,假设我有以下C类: 对于引用类型,readonly的含义是什么?我刚刚实现了这段代码,用户可以修改datatable 如何防止用户写入或修改我的数据表(或任何对象)?即,仅读取访问权限。显然,在这里使用属性没有帮助 Readonly意味着您不能重新分配变量-例如,稍后您不能将新的数据表分配给dt 至于将对象本身设置为只读,这完全取决于对象本身。没有使对象不可变的全局约定 我没有看到使用.NET的DataTable实现这一点的任何具体方法,但有一些选项是 确保用户在数据库本身中没有修改权限(最安全

假设我有以下C类:

对于引用类型,
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;