繁体   English   中英

如何将参数传递给C#类?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM