处理类中全局变量的方法

时间:2012-06-13 09:10:02

标签: c# c#-4.0

有这样的PHP代码,(这里是php函数的一部分)将它转换为C#。

function jaktDate2()
{
    Global $nameofselectbox,$startYear,$endYear,$year,
    $startDate,$endDate,$startMounth,$endMounth,$startDay,$endDay;
    $today = getdate();
    $year=$today['year'];
    $mounth=$today['mon'];
    $day=$today['mday'];

我的C#代码试试这个,

  public class HuntingDate
    {
        public string StartYear;
        public string EndYear;
        public string Year;
        public DateTime StartDate;
        public DateTime EndDate;
        public string StartMonth;
        public string EndMonth;
        public DateTime StartDay;
        public DateTime EndDay;


    }

我是从这种方式开始的..这样的方式是否正确?我接下来该怎么做?

7 个答案:

答案 0 :(得分:2)

你可以这样做:

public int Num { get; set; }

而不是:

private int _num;
public int Num { get { return _num; } set { _num = value; } }

关于最后一部分:

DateTime today = DateTime.Now;
int year = today.Year;
int month = today.Month;
int day = today.Day;

请注意,today也会有小时,分钟,秒和毫秒。如果您只想Date部分Now,或任何其他DateTime对象(也称为“修剪”从小时开始向下的“小计数”) - 您可以这样做:

DateTime dateOnly = someDate.Date;

// someDate: 2.4.2012 10:04:12:0004
// dateOnly: 2.4.2012 00:00:00:0000

看起来你还需要从年,月和日创建一个DateTime对象,所以:

this.StartDate = new DateTime(startYear, startMonth, startDay);

修改

// This gets called the moment you initialize the object
public HuntingDate()
{
    DateTime today = DateTime.Now;
    int year = today.Year;
    int month = today.Month;
    int day = today.Day;

    // more logic, to set StartDate and EndDate
}

现在从外面你可以做某个地方:

HuntingDate hd = new HuntingDate();
DateTime sd = hd.StartDate;
DateTime ed = hd.EndDate;

答案 1 :(得分:2)

在.NET中,您不需要拥有私有成员变量,因为编译器会在编译期间添加它。

因此你可以改变

private string _year;
public string Year
{
    get { return _year;}
    set { _year = value;}
}

更好看的东西。

public string Year { get; set; }

要在.NET中使用日期,您只需使用System.DateTime.Now,然后访问System.DateTime.Now.DaySystem.DateTime.Now.Year等任何属性。

答案 2 :(得分:1)

如果将这些属性定义为更好,则更好。 See here for the reason。无论如何,你写的课程是完全有效的,只是不被认为是一个好习惯。您可能也会添加一个构造函数,也会像PHP代码那样初始化一些值。

答案 3 :(得分:1)

这里有属性:

public class HuntingDate
{
    public string StartYear{
        get;
        set;
    }
    public string EndYear{
        get;
        set;
    }
}

答案 4 :(得分:1)

您定义的类似乎更像是一个随机的值,而不像一个明确定义的类。所有这些价值实际上代表了什么?

public string StartYear;
public string EndYear;
public string Year;
public DateTime StartDate;
public DateTime EndDate;
public string StartMonth;
public string EndMonth;
public DateTime StartDay;
public DateTime EndDay;

例如,StartDateStartDay之间有什么区别?什么是StartYearStartMonth?这个类实际上是什么定义?您似乎正在尝试将DateTime值分解为组件。你不需要这样做。一个简单的DateTime值将足以存储必要的信息,您可以直接从该值获取组件:

public DateTime StartDate;
public DateTime EndDate;

例如,如果您需要知道月份,则可以从该值获取:

myObject.StartDate.Month;

要继续改进课程,您需要使用属性而不是公共成员。在C#中,这些看起来像这样:

public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }

这些特别称为自动实现的属性。他们为完整属性编写了简写程序:

private DateTime _startDate;
public DateTime StartDate
{
    get { return _startDate; }
    set { _startDate = value; }
}
// repeat for EndDate

属性的好处是该类对其内部结构的暴露程度较低。如果您需要向类中添加任何逻辑(例如检查日期的特定边界,例如确保过去没有StartDate),那么您可以将其添加到属性中,而不会破坏类的二进制兼容性。所以消费代码永远不需要知道差异。例如:

private DateTime _startDate;
public DateTime StartDate
{
    get { return _startDate; }
    set
    {
        if (value < DateTime.Now)
            throw new ArgumentException(string.Format("Start Date must not be in the past: {0}", value.ToString()));
        _startDate = value;
    }
}

通过继续定义此类的行为,您可以继续更进一步。即使暴露这些属性仍然使这个类更像是一个&#34;数据结构&#34;而不是&#34;对象。&#34; (有关数据/对象反对称性的进一步阅读,我建议使用Robert Martin的Clean Code。)正确的面向对象设计的目标是让对象隐藏其数据并公开内部对该数据执行有状态操作的方法

例如,如果您需要将EndDate延长一天,则可以执行以下操作:

myObject.EndDate += new TimeSpan(1, 0, 0, 0);

但是更加面向对象的方法(坚持使用&#34;告诉,不要问&#34;校长)将告诉对象本身延长时间,而不是直接告诉其数据扩展时间(因此&#34;询问&#34;对象在过程中的数据,这可能也违反了得墨忒耳法则):

myObject.ExtendEndDate(new TimeSpan(1, 0, 0, 0));

甚至:

myObject.ExtendEndDateInDays(1);

您只需要在对象上实现这样的方法,该方法内部扩展EndDate的值。

类本身应该封装它所代表的概念所需的所有功能。如果绝对必要,它可以为其内部成员提供公共读取访问权限,但从设计角度来看,值得问一下自己需要针对对象的数据进行何种查询以及提供更有针对性的方法对于那些查询,而不是直接访问该类&#39;数据成员。

答案 5 :(得分:1)

没有办法像在PHP中那样在c#中执行全局操作。 你可以使用单例或静态类来做到这一点。

public static class HuntingDate
{
    public static string StartYear { get; set; }
}

然后在你的代码中

HuntingDate.StartYear = DateTime.Now

var startYear = HuntingDate.StartYear

答案 6 :(得分:0)

C#中没有全局变量声明。因为它是Object Oriented Programming语言。在您的情况下,您可以声明static class

public static class HuntingDate
{
    public static string StartYear 
    {
      get; 
      set; 
    }
    public static string EndYear 
    {
      get; 
      set; 
    }
    // and so on
}

您可以从类名中访问这些属性。

HuntingDate.StartDate = DateTime.Now;
HuntingDate.EndDate = DateTime.Now.AddDays(10);