Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在类中处理全局变量的方法_C#_C# 4.0 - Fatal编程技术网

C# 在类中处理全局变量的方法

C# 在类中处理全局变量的方法,c#,c#-4.0,C#,C# 4.0,有这样的php代码,(这里是php函数的一部分)将其转换为C 我的C代码尝试是这样的 public class HuntingDate { public string StartYear; public string EndYear; public string Year; public DateTime StartDate; public DateTime EndDate; public

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

我的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;


    }

我从这里开始。。这样对吗?下一步该怎么办?

如果将这些定义为属性,效果会更好。无论如何,您编写的类是完全有效的,只是不被认为是一个好的实践。您可能也会像php代码那样添加构造函数,初始化一些值

这里是它的属性:

public class HuntingDate
{
    public string StartYear{
        get;
        set;
    }
    public string EndYear{
        get;
        set;
    }
}
private DateTime _startDate;
public DateTime StartDate
{
    get { return _startDate; }
    set { _startDate = value; }
}
// repeat for EndDate

您定义的类更像是一个随机的值抓取包,而不是一个定义良好的类。所有这些值实际上代表什么

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;
例如,
StartDate
StartDay
之间有什么区别?什么是
StartYear
StartMonth
?这个类实际上定义了什么?看起来您正试图将
DateTime
值分解为组件。你不需要那样做。一个简单的
DateTime
值将充分存储必要的信息,您可以直接从该值获取组件:

public DateTime StartDate;
public DateTime EndDate;
myObject.StartDate.Month;
例如,如果您需要知道月份,可以从该值中获取:

public DateTime StartDate;
public DateTime EndDate;
myObject.StartDate.Month;
要继续改进该类,您需要使用属性而不是公共成员。在C#中,这些将如下所示:

public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
这些具体称为自动实现属性。它们是完整属性的简写:

public class HuntingDate
{
    public string StartYear{
        get;
        set;
    }
    public string EndYear{
        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;
    }
}
但更面向对象的方法(坚持“告诉,不要问”原则)是告诉对象本身延长时间,而不是直接告诉其数据延长时间(从而在过程中“询问”对象的数据,这可能也违反了德米特定律):

甚至:

myObject.ExtendEndDateInDays(1);
您只需要在对象上实现这样一个方法,该方法将在内部扩展
EndDate
的值


类本身应该封装它所表示的概念所必需的所有功能。如果绝对必要,它可以提供对其内部成员的公共读取访问,但从设计角度来看,有必要问问自己真正需要对对象的数据进行何种查询,并为这些查询提供更有针对性的方法,而不是直接访问类的数据成员。

在c#中无法像在PHP中那样进行全局访问。 您可以使用单例或静态类来实现这一点

public static class HuntingDate
{
    public static string StartYear { get; set; }
}
然后在代码中

HuntingDate.StartYear = DateTime.Now


C#中没有全局变量声明。因为它是一种语言。在您的情况下,您可以申报

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

HuntingDate.StartDate = DateTime.Now;
HuntingDate.EndDate = DateTime.Now.AddDays(10);
您可以这样做:

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;
请注意,今天的
还将包含小时、分钟、秒甚至毫秒。如果您只想
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;

在.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.Day
System.DateTime.Now.Year
等。您能给我一个提示吗?我是C#?公共字符串StartYear{get;set;};只需谷歌c#properties。我对php中的
global
的内部工作原理有点不确定,但我相信
public static
是c#的正确替代。并指出了答案,如果可能,请使用属性而不是字段。Ex
public static string StartMonth{get;set;}
@ChathuraRanasinghe只是一个例子,没有任何正当理由。。。。。无论如何,此方法用于在datetime对象中添加天。这可能是该问题的唯一直接答案。但是关于这个问题的有效性可能会有一些讨论…@Yorye Nathan我犯了这个错误。。“字段初始值设定项无法引用非静态字段、方法或属性”您可能试图按原样将代码放入类中。根据需要,您应该在类的方法或构造函数中使用它。再见。@Yorye Nathan int year=今天。年;在今天的这里,红色下划线和显示。进一步澄清,请参阅此linkNormal代码应在可执行范围内。您在其中编写代码的范围通常是类-它只保存字段、成员和方法等。您应该在方法或构造函数(初始化对象时被调用的“方法”)中编写代码-请参阅我的编辑,以了解您将如何实际执行此操作并从外部使用它。总的来说,我建议按部就班地学习C#,因为你似乎有很多东西要学。祝你好运!:)@Yorye Nathan解决了。谢谢。是的,我是一个初学者。有很多东西要学。一步一步地学习我犯了这个错误。。字段初始值设定项不能引用非静态字段、方法或属性
public string Year { get; set; }