Property的值显示为null

时间:2018-02-28 00:29:25

标签: c# properties

我有一个静态类IDGENERATOR。 它会像CurrentYear-CurrentMonth-Serial一样自动生成id。 防爆。 2018-02-00001 当月份更改序列号设置为00000时。

我做到了。

boost::any

它将生成id并存储在generate变量中。

当我从另一个类调用Generate并打印它时,我显示为null。

static class IDGENARATOR
{
    private static int serial_no;
    static DateTime dt = DateTime.Now;
    static int month = Convert.ToInt32(DateTime.Today.Month);


    public static string generate;

    public static string Generate
    {
        get
        {
            return generate;
        }
        set
        {
            serial_no++;
            generate = String.Format("{0}-{1}-{2}", dt.Year, month.ToString("00"), serial_no.ToString("00000"));

            if (month < DateTime.Today.Month)
            {
                serial_no = 00000;
            }
            serial_no += 1;
        }
    }
}

错误是什么?

2 个答案:

答案 0 :(得分:0)

我不确定您是否已经意识到这一点,请原谅我,如果我错了,但 generate Generate之间存在差异在您的代码中。第一个是静态字段,第二个是静态属性。字段存储您放入其中的任何值,并且属性在读取/写入时运行get / set代码。

除非您指定初始值,否则字符串类型字段最初将为null,这是 generate 字段的情况。由于 generate 为null,因此读取 Generate 也会返回null,因为它的get代码只会返回 generate 字段的值。就像目前一样,代码运行的唯一方法是首先写入 Generate 然后将值分配给 generate 并允许随后读取 Generate 返回null以外的其他内容

您可能需要考虑重写代码:

static class IDGENERATOR {

  public static string Generate {
    get {
      string id;

      id = ..... // Do the work of generating a new ID here
      return(id);
    }
  }

}

使用这种类型的代码,每次读取 Generate 属性时,它都会执行创建新序列号的工作

无论如何,这里还有其他问题。你需要以这样一种方式保存状态,使它记住序列号和月中间会话(因为你的代码不会永远运行),这完全是另一个问题

您还应该考虑将get语句的主体括在lock语句中,以防止多个线程同时访问该属性时出错

答案 1 :(得分:0)

您也可以使用Guid类生成通用ID。 为此,您可以编码:

public static string GetSerial()
    {
        return Guid.NewGuid().ToString();
    }

此代码将返回如下内容: 87132860-7bb3-41df-83b7-2f99b04aafa0并且每次都是不同的序列。