试图将类成员公开为只读或公共常量
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;
我的问题是我需要将这两组表(Tid
和TblName
)的详细信息暴露给应用程序的其余部分,但是当应用程序启动时它调用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;
如果您愿意,也可以是 internal
或 protected
。
【讨论】:
您能否更好地解释或给出一个简单的示例,因为我发现@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;
【讨论】:
所以现在当我尝试使用 /accesscurrProjData.CustomersTid
作为属性时,在应用程序周围的某些方法中,它不会为 null 或零,因为它被分配(由 CustomersMeta.TableID
)叫?
我在上一条评论中向您询问了有关使用情况的信息,因为我没有等待超过 30 分钟才收到您的回复,因此我尝试用您示例中的属性替换我的字段,所以只需用 ypur 代码(属性)替换这些字段使值在我尝试使用您的解决方案之前位于变量(属性)内,它们是空/空的,所以您的答案确实有帮助!我不知道为什么尽管其他人暗示要使用私人修饰符设置设置器,但您建议的方式会导致错误,所以非常感谢,标记为正确的以上是关于试图将类成员公开为只读或公共常量的主要内容,如果未能解决你的问题,请参考以下文章