[英]How to pass parameter to class C#?
我的代码如下
public class LocalDB
{
public static int e_SessionID;
public static string e_EventName;
public static string e_TimeCreate;
}
在其他课程中:
public static LocalDB newEvent ;
public void something()
{
newEvent.e_SessionID=123;
}
但它无法传递价值。
问题:您正尝试使用实例引用变量newEvent
访问静态newEvent
,如下所示:
newEvent.e_SessionID=123;
//^^^Here
解决方案:您需要使用classname
来访问static
字段
newEvent.e_SessionID=123;
//^^^Replace with classname LocalDB here
替换这个:
newEvent.e_SessionID = 123;
有了这个:
LocalDB.e_SessionID = 123;
静态方法和变量只能使用类名调用,并且您尝试使用类对象进行调用。
如果要设置e_SessionID
的值,请使用类名设置值,如下所示
LocalDB.e_SessionID=123;
你为什么不将它们设置为属性? 阅读此SO帖子为什么更喜欢属性到公共变量
“字段被认为是类的实现细节,并暴露它们公开打破封装。”
public class LocalDB
{
public int SessionID { get; set; }
}
尝试使用属性:
public class LocalDB
{
public int e_SessionID { get; set; }
public string e_EventName { get; set; }
public string e_TimeCreate { get; set; }
}
首选实例数据到静态数据。
静态数据实际上是全局状态。 您的计划有效期内只有一个活动吗? 如果您需要支持多线程怎么办? 这是面向对象的编程; 使用对象。
封装数据。
避免公开领域。 像其他人所说的那样,选择房产。 请注意,这允许在构造时分配创建时间(并且仅在此时)。
使用适当的类型。
如果要存储日期/时间值,通常可以使用DateTime
类。
赞成不变性。
如果您在构造时知道属性的值,则设置它们然后不允许更改它们。
想想名字。
描述性名称很重要,特别是当您在六个月后进行维护时。 我没有在我的示例中更改LocalDB
的名称,因为我不知道您的域或用例。 但是,对于我来说,这个类看起来更像是一个事件而不是数据库。 Event
会更好吗?
以下示例使用C#6语法; 早期版本需要添加私有setter并将初始化移动到构造函数。
public class LocalDB
{
public LocalDB(int sessionID, string eventName)
{
SessionID = sessionID;
EventName = eventName;
}
public int SessionID { get; }
public string EventName { get; }
public DateTime TimeCreate { get; } = DateTime.UtcNow;
}
public class Other
{
public void DoSomething()
{
NewEvent = new LocalDB(1, "Other Event");
}
public LocalDB NewEvent { get; private set; }
}
此示例中的一个缺陷是,在NewEvent
时, Other
实例的NewEvent
属性将为null
。 尽可能避免使用空值。 也许这应该是一系列事件; 不知道你的用例我不能说。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.