2011-10-11 87 views
0

是否可以創建一個指向DateTime對象的C#指針?我試圖做到這一點:是否有可能爲DateTime對象創建C#'指針'?

DateTime Event1 = DateTime.Now; 
DateTime Event2 = DateTime.Now.AddYears(10); 

DateTime EventPointer; // A Pointer? 

if (something) 
{ 
    EventPointer = Event1; 
} 
else 
{ 
    EventPointer = Event2; 
} 

EventPointer.DoSomething? // Something that would change the value of Event1/2 variable. 

回答

5

不是直接的,但你可以將其套在一個類:

Wrapper w1 = new Wrapper { TheDate = DateTime.Now }; 
Wrapper w2 = new Wrapper { TheDate = DateTime.Now.AddYears(10) }; 

Wrapper w; 
if (something) 
{ 
    w = w1; 
} 
else 
{ 
    w = w2; 
} 

w.DoSomething(); 

class Wrapper 
{ 
    public DateTime TheDate { get; set; } 
    public void DoSomething() 
    { 
    } 
} 
+0

這就是我一直在尋找的。我以某種方式假定DateTime是一個類,而不是一個結構。 – Jeff

1

DateTime是否是它不像引用類型,每次將其值賦給另一個變量的值複製值類型。

0

正如您在考慮的那樣,指針不存在於託管的C#代碼中。如果您需要傳遞DateTime並使原始值發生更改,則可能需要查看outref參數。由於DateTimes是結構體(值類型),因此它們總是被複制而不是通過引用傳遞,除非您特別使用outref參數。

0

一個DateTime是值類型,當你給它分配的值複製。但是,方法可以使用關鍵字ref來引用值類型。您的EventPointer.DoSomething會將DateTime作爲參考。這裏有一個簡單的例子,說明你可以如何應用它。

var date = DateTime.Today; 
MakeMinValue(ref date); 
Console.Out.WriteLine("date = {0}", date); 

public void MakeMinValue(ref DateTime dateTime) 
{ 
    dateTime = DateTime.MinValue; 
} 

這隻適用於方法參數。

1
  1. 除非您使用unsafe,否則您不能使用託管代碼中的指針。我建議反對它。
  2. DateTimes是不可變的。您可以做的修改DateTime類型變量的唯一方法是重新分配給它。

你可以做一些接近你想要什麼,但總的來說它不是一個好主意,這樣做:

DateTime event1 = new DateTime(2011, 10, 11); 
DateTime event2 = new DateTime(2021, 10, 11); 

Action<DateTime> eventPointer; // A Pointer? 

if (true) 
{ 
    eventPointer = x => { event1 = x; }; 
} 
else 
{ 
    eventPointer = x => { event2 = x; }; 
} 

eventPointer(new DateTime(2016, 10, 11)); 

Console.WriteLine(event1.ToString(CultureInfo.InvariantCulture)); 
Console.WriteLine(event2.ToString(CultureInfo.InvariantCulture)); 

結果:

 
10/11/2016 00:00:00 
10/11/2021 00:00:00 

我認爲這是更好的主意是找到解決問題的另一種方法。

0

您可以從DateTime類型更換的EventPointerEvent1Event2種類型DateTime?。它使EventPointer的類型爲可空引用類型。

DateTime? Event1 = DateTime.Now; 
DateTime? Event2 = DateTime.Now.AddYears(10); 

DateTime? EventPointer; 

if (condition) 
{ 
    EventPointer = Event1; 
} 
else 
{ 
    EventPointer = Event2; 
} 

EventPointer.Value //.DoSomething 
相關問題