-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、またはその他の DateTime オブジェクトの一部のみが必要な場合Now(別名、時間以下から始まる「小さなカウント」を「トリム」)-次のことができます。

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.DaySystem.DateTime.Now.Year

于 2012-06-14T05:25:26.300 に答える
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ですかStartDay? StartYearととは何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、1 日延長する必要がある場合は、次のようにします。

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# で global を行う方法はありません。シングルトンまたは静的クラスを使用してそれを行うことができます。

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

次に、コードで単純に

HuntingDate.StartYear = DateTime.Now

また

var startYear = HuntingDate.StartYear
于 2012-06-13T09:25:17.237 に答える
1

これらをプロパティとして定義するとよいでしょう。理由はこちらをご覧ください。とにかく、あなたが書いたクラスは完全に有効ですが、良い習慣とは見なされません。おそらくコンストラクターも追加し、php コードと同様にいくつかの値を初期化します。

于 2012-06-13T09:11:02.850 に答える
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 に答える