处理类中全局变量的方法
有这样的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; }
我是这样开始的..这样的方式是否正确? 我接下来该怎么办?
你所定义的类似乎更像是一个随机的值,而不像一个明确定义的类。 所有这些价值实际上代表了什么?
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
什么StartDay
? 什么是StartYear
和StartMonth
? 这个class级实际定义的是什么? 看起来您正试图将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; } }
通过继续定义此类的行为,您可以继续更进一步。 即使暴露这些属性仍然使类更像是“数据结构”而不是“对象”。 (有关数据/对象反对称性的进一步阅读,我建议使用Robert Martin的Clean Code。)正确的面向对象设计的目标是让对象隐藏其数据并公开内部对该数据执行有状态操作的方法。
例如,如果您需要将EndDate
延长一天,则可以执行以下操作:
myObject.EndDate += new TimeSpan(1, 0, 0, 0);
但是更加面向对象的方法(坚持使用“告诉,不要求”主体)将告诉对象本身延长时间,而不是直接告诉其数据延长时间(从而“询问”对象它在过程中的数据,可以说也违反了得墨忒耳法则):
myObject.ExtendEndDate(new TimeSpan(1, 0, 0, 0));
甚至:
myObject.ExtendEndDateInDays(1);
您只需要在对象上实现这样的方法,该方法将在内部扩展EndDate
的值。
类本身应该封装它所代表的概念所需的所有function。 如果绝对必要,它可以为其内部成员提供公共读取访问权限,但从设计角度来看,值得问一下自己需要针对对象的数据进行哪种查询,并为这些查询提供更有针对性的方法,而不是直接访问到class级的数据成员。
在.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
等。
你可以这样做:
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;
如果将这些属性定义为更好,则更好。 看到这里的原因 。 无论如何,你写的课程是完全有效的,只是不被认为是一个好习惯。 您可能也会添加一个构造函数,也会像PHP代码那样初始化一些值。
这里有属性:
public class HuntingDate { public string StartYear{ get; set; } public string EndYear{ get; set; } }
没有办法像在PHP中那样在c#中进行全局操作。 你可以使用单例或静态类来做到这一点。
public static class HuntingDate { public static string StartYear { get; set; } }
然后在你的代码中
HuntingDate.StartYear = DateTime.Now
要么
var startYear = HuntingDate.StartYear
C#中没有全局变量声明。 因为它是面向对象的编程语言。 在您的情况下,您可以声明一个静态类
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);