-2

有一个这样的 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;


    }

我是这样开始的。。这样对吗?我下一步该怎么做?

4

7 回答 7

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;
于 2012-06-14T05:24:37.207 回答
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.DayorSystem.DateTime.Now.Year等​​。

于 2012-06-14T05:25:26.300 回答
1

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

于 2012-06-13T09:11:02.850 回答
1

这是带有属性的:

public class HuntingDate
{
    public string StartYear{
        get;
        set;
    }
    public string EndYear{
        get;
        set;
    }
}
于 2012-06-13T09:14:24.983 回答
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;

StartDate例如,和有什么区别StartDayStartYear和是什么StartMonth?这个类实际上定义了什么?看起来您正在尝试将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.

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

于 2012-06-13T09:24:59.400 回答
1

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

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

然后在你的代码中

HuntingDate.StartYear = DateTime.Now

或者

var startYear = HuntingDate.StartYear
于 2012-06-13T09:25:17.237 回答
0

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);
于 2012-06-13T09:50:44.737 回答