2012-05-03 142 views
0

我有一些在我的項目具有將包含匹配值時,他們正在初始化領域對象 - 請參閱下面的示例代碼片段,在 特別是AddedDateTimeModifiedDateTime性質:避免重複對象初始值

User user = new User() 
{ 
    FirstName = "Tex", 
    Surname = "Murphy", 
    AddedDateTime = DateTime.Now, 
    ModifiedDateTime = DateTime.Now 
}; 

是否有可能一旦被設置爲ModifiedDateTime值設置爲AddedDateTime值時,{...}塊之內?

我有一種感覺這是不可能的,但認爲它值得要求確認。

+1

你爲什麼不嘗試,讓我們知道? – banging

+1

如果您執行'ModifiedDateTime = AddedDateTime',會發生什麼? – mattytommo

+0

如果你願意,你也可以嘗試'AddedDateTime = ModifiedDateTime = DateTime.Now'。 – banging

回答

1

我不確定這是不是你之後的事,但這是否合適?

var now = DateTime.Now; 
User user = new User 
{ 
    FirstName = "Tex", 
    Surname = "Murphy", 
    AddedDateTime = now, 
    ModifiedDateTime = now 
}; 

如果你想擁有它們初始化爲相同的值,那麼你必須設置一個公共變量的值。

+0

根據回覆(謝謝大家),這似乎是唯一可行的選擇 - 不是我希望的答案,而是下一個最好的選擇。我認爲這可能是這種情況。真正令人遺憾的是,.Net對象初始化器不允許你獲取已經在同一個初始化塊中設置的屬性的值。謝謝@Reddog – Bern

0
User user = new User 
      { 
       FirstName = "Tex", 
       Surname = "Murphy", 
       AddedDateTime = DateTime.Now < Something? DateTime.Now : SomeOtherValue, 
       ModifiedDateTime = DateTime.Now < Something? DateTime.Now : SomeOtherValue 
      }; 
+0

不是我想要的。我想設置AddedDateTime,然後將ModifiedDateTime設置爲AddedDateTime。這就是如果它是可能的。 – Bern

0

正如在評論中提到,你可以把包含了你所需要的數據,即:

public User(string firstName, string sirname) 
{ 
    FirstName = firstName, 
    Surname = sirname, 
    AddedDateTime = DateTime.Now, 
    ModifiedDateTime = DateTime.Now 
}; 

你也可以有輔助的方法來創建類的實例構造函數。他們可能是類的內部或不

public static User CreateUser(string firstName, string sirname) 
{ 
    User newUser = new User(); 
    newUser.FirstName = firstName, 
    newUser.Surname = sirname, 
    newUser.AddedDateTime = DateTime.Now, 
    newUser.ModifiedDateTime = DateTime.Now 

    return newUser; 
}; 

你也可以有這樣的事情(如果你無法控制的類本身,這是很有用):

public static User CreateUser(string firstName, string sirname, string otherdata) 
{ 
    User newUser = new User(); 
    newUser.FirstName = firstName, 
    newUser.Surname = sirname, 
    newUser.AddedDateTime = DateTime.Now, 
    newUser.ModifiedDateTime = DateTime.Now, 
    newUser.SomeField = otherdata, 
    newUser.SomeOtherField = otherdata 

    return newUser; 
}; 
+0

我的目標是儘可能縮短代碼,並避免調用DateTime.Now兩次,理想情況下我希望它的值在初始化時反映在ModifiedDateTime中。對不起,您的上述建議表示讚賞,但不解決問題。 – Bern

+0

他們如何解決這個問題?使用前兩種方法,您不需要一次輸入'DateTime.Now',更不用說兩次了。第三個代碼片段涵蓋了在每個創建對象中都有一些不常見的數據的一般情況,但是它被設置爲兩個(或更多)屬性。如果這不能解決你確切的問題,那麼你可能需要提供一個你想要的成品能夠做到的例子。 – Servy

+0

在回答你的第一個問題時,你的回答並沒有解決我提出的最初問題,那就是避免訪問DateTime.Now屬性兩次。 – Bern

0

你可以把邏輯進入您的AddedDateTime的設置器檢查ModifiedDateTime上的最小值並進行相應設置。例如

public DateTime ModifiedDateTime { get; set; } 
private DateTime _addedDateTime; 
public DateTime AddedDateTime { 
    get { return _addedDateTime; } 
    set 
    { 
     if (ModifiedDateTime == DateTime.MinValue) 
     { 
      ModifiedDateTime = _addedDateTime = value; 
     }; 
    } 
} 

... 

var test = new Test 
{ 
    AddedDateTime = DateTime.Now 
}; 
1

也許你可以把這個邏輯到性能的實現:

public class User{ 
    private DateTime added; 
    private DateTime? modified; 

    string FirstName {get;set;} 
    string SurName {get;set;} 

    DateTime AddedDateTime { 
    get { return added; } 
    set { added = value; 
     modified = modified ?? value; 
     } 
    } 

    DateTime? ModifiedDateTime { 
    get { return modified } 
    set { modified = value; } 
    } 
}