我有一个静态类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;
}
}
}
错误是什么?
答案 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并且每次都是不同的序列。