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