试图将类成员公开为只读或公共常量

Posted

技术标签:

【中文标题】试图将类成员公开为只读或公共常量【英文标题】:trying to expose a class member to be public and readonly or a public constant 【发布时间】:2012-11-24 19:11:27 【问题描述】:

我被一个简单的变量赋值卡住了,这是让它对我来说有点复杂的唯一条件 是我需要结构值是私有的,所以它们不会被修改

为了能够以安全的方式使用结构的值,我正在尝试使用 public readonly variables 。这就是我如何以只读模式与应用程序共享信息的方式,不应该很简单吗?

我错过了什么?

当应用程序在 Page_Load 启动时,我正在调用 SetTablesMetaDetails()

protected void Page_Load(object sender, EventArgs e)

    if(!Page.IsPostBack)
    
      .... some other App inits here
    
    
    else
    
 
        

    // this method should be the one that instanciates the DbTable struct
   //..thus sets the values of tables "Name" and "ID"
   currProjData.setTablesReferences(); 

struct,将用于赋值:
            public class DBMetaDetails
            
                public struct DbTable
                
                    public DbTable(string tableName, int tableId): this()
                    
                        this.TableName = tableName;
                        this.TableID = tableId;
                    

                    public string TableName  get;  set; 
                    public int TableID  get;  set; 
                
            
保存值的当前项目类
public static class currProjData 

    static DBMetaDetails.DbTable CustomersMeta = new DBMetaDetails.DbTable();
    static DBMetaDetails.DbTable TimesMeta = new DBMetaDetails.DbTable();

    public static void SetTablesMetaDetails()
    

        TimesMeta.TableID = HTtIDs.TblTimes;
        TimesMeta.TableName = HTDB_Tables.TblTimes;

        CustomersMeta.TableID = HTtIDs.TblCustomers;
        CustomersMeta.TableName = HTDB_Tables.TblTimeCPAReport;

    

    public static readonly int CustomersTid = CustomersMeta.TableID;
    public static readonly string CustomersTblName = CustomersMeta.TableName;

    public static readonly int TimesTid = TimesMeta.TableID;
    public static readonly string TimesTblName = TimesMeta.TableName;

我的问题是我需要将这两组表(TidTblName)的详细信息暴露给应用程序的其余部分,但是当应用程序启动时它调用SetTablesMetaDetails()

最后四行没有执行,我尝试将此部分移至SetTablesMetaDetails() 但这不是正确的语法,我收到错误,

完成CustomersTid 的分配的正确方法是什么? (也包括其余 3 个)

public static readonly int CustomersTid = CustomersMeta.TableID;

这就是我所缺少的,因为我不知道如何以与上面的结构相同的方式对其进行初始化......最好在一个方法调用中

【问题讨论】:

旁注:可变的struct 可能会让你哭泣。请先阅读***.com/questions/441309/why-are-mutable-structs-evil,然后再允许set 对您的struct 成员使用。 @AlexeiLevenkov,试图理解什么是 mutable 与 immutable ,并没有真正理解有什么区别,因为构建结构是反复试验而不是添加 :this() 解决了我的问题,所以如果您还可以提供一个如何正确编码的示例,我会很高兴! public string TableName get; private set; @AlexeiLevenkov 试图访问 SetTablesMetaDetails() 中的 TimeMeta.TableID 结构:错误-“set accessor is inaccessible”(昨天尝试过..这就是我尝试不使用私有修饰符的原因,我在问每个人这里没有回复) TimeMeta = new DBMetaDetails.DbTable("bla","bla") 不适合您? 【参考方案1】:

如果你想在本地修改它们,但在全局范围内读取它们,请在 setter 中添加一个修饰符:

public string TableName  get;  private set; 
public int TableID  get;  private set; 

如果您愿意,也可以是 internalprotected

【讨论】:

您能否更好地解释或给出一个简单的示例,因为我发现@Jmonsorno 回答了正确的方向,您的答案确实适用于结构,但没有解决如何初始化公共CustomersTid(即公共可访问值)与 CustomersMeta.TableID 结构私有值 我确实用你的版本实现了它,我在这篇文章的前一天就知道了,我以为我不知道如何避免 setter bing 无法访问的简单问题,所以我就把它扔了离开(:没有时间处理它,aventualy我确实学会了使用它,所以谢谢你的帮助。【参考方案2】:

使用属性

public static int CustomersTid  get  return CustomersMeta.TableID;  
public static string CustomersTblName  get  return CustomersMeta.TableName;  

public static int TimesTid   get  return TimesMeta.TableID;  
public static string TimesTblName   get  return TimesMeta.TableName;  

【讨论】:

所以现在当我尝试使用 /access currProjData.CustomersTid 作为属性时,在应用程序周围的某些方法中,它不会为 null 或零,因为它被分配(由 CustomersMeta.TableID)叫? 我在上一条评论中向您询问了有关使用情况的信息,因为我没有等待超过 30 分钟才收到您的回复,因此我尝试用您示例中的属性替换我的字段,所以只需用 ypur 代码(属性)替换这些字段使值在我尝试使用您的解决方案之前位于变量(属性)内,它们是空/空的,所以您的答案确实有帮助!我不知道为什么尽管其他人暗示要使用私人修饰符设置设置器,但您建议的方式会导致错误,所以非常感谢,标记为正确的

以上是关于试图将类成员公开为只读或公共常量的主要内容,如果未能解决你的问题,请参考以下文章

C#图解教程 第六章 深入理解类

为啥类成员是私有的而属性是公共的? [复制]

火山中文编程(PC) -- 变量与常量

类的静态成员

在 Java 中,公开对象的成员是否一个坏主意?

Python - 访问类的受保护成员_