使用stringbuilder将时间放入字符串(类)C#

时间:2012-04-10 15:54:05

标签: c# time stringbuilder

   public string getTime()
   {
       StringBuilder RetString = new StringBuilder();
       RetString.Append(Hours.ToString().PadLeft(2, '0') + "-" + Min.ToString().PadLeft(2, '0') + "-" + AMPM.PadLeft(2, '0'));
       return RetString.ToString();
   } 

我正在尝试使用此方法将时间(以字符串格式)返回给表单字符串变量。我有用户设置来输入一个时间,时间存储在这个类中,现在我正在做的就是将这些数据带到我工作的表单中。我已经验证了数据进入类并存储在变量。

我得到的错误是:

CSharp_Null

不确定问题是什么。 我当然声明了变量

    private int Hours;
    private int Min;
    private string AMPM;

我有设置设置:

public int _hours
    {
        get
        {
            return Hours;
        }
        set
        {
            if (value <= 12 && value >= 1)
            {
                Hours = value;
            }
            else
                Hours = 0;
        }
    }

    public int _min
    {
        get
        {
            return Min;
        }
        set
        {
            if (value <= 59 && value >= 1)
            {
                Min = value;
            }
            else
                Min = 0;
        }
    }

    public string ampm
    {
        get
        {
            return AMPM;
        }
        set
        {
            if (AMPM == "AM" || AMPM == "PM")
            {
                AMPM = value;
            }
            else
                AMPM = "";
        }
    }

和我对班级的呼吁:

string timefromclass;
timefromclass = timec.getTime();

我认为唯一可能是我打电话给我存储时间的课程

C_Time time = new C_Time();

但另一种形式我也设置了另一种形式。

C_Time timec = new C_Time();

可能我正试图从空实例中检索时间?

编辑:

public void setTime(int hours, int min, string aMPM)
    {
        Hours = hours;
        Min = min;
        AMPM = aMPM;

这是我唯一分配变量的地方。

4 个答案:

答案 0 :(得分:4)

您是否在代码中的某处初始化AMPM。如果不是,它将为null(引用类型变量的默认值),并且在其上调用PadLeft将为您提供NRE。

答案 1 :(得分:3)

从您的代码中,我假设您的AMPM字段为null

除了你在代码中调用的setter之外,你似乎没有在任何地方实例化它。

初始化它应解决问题:

private string AMPM = string.Empty;

答案 2 :(得分:1)

您获得的错误意味着您正在尝试阅读尚未初始化的“参考类型”,因此 null

int 是“值类型”,值类型不能表示空值。

字符串是“引用类型”,是您班级中唯一的引用类型(AMPM)。这必须是问题所在。

您需要初始化AMPM以停止错误。如果您还没有,那么在您的类中添加构造函数是处理初始化的好方法。例如:

public C_Time()
{
    AMPM = "";
}

答案 3 :(得分:1)

正如其他人所指出的那样AMPM就是问题所在。你应该像这样定义它

private string _ampm;

public string AMPM
{
    get
    {
        return _ampm ?? ""; // Returns "" if _ampm == null
    }
    set
    {
        _ampm = value;
    }
}

然后使用属性

AMPM.PadLeft( ...

但为什么不使用

String.Format("{0:00}-{1:00}-{2}", Hours, Min, AMPM.PadLeft(2, '0'));

使用枚举

会更安全
public enum AmPm
{
    Undefined,
    AM,
    PM
}

这清楚地列举了有效的条目。否则你可以输入类似“下午”或“上午”而不是“上午”的东西。