是否可以创建一个指向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.
答案 0 :(得分: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()
{
}
}
答案 1 :(得分:1)
DateTimes是值类型,与引用类型不同,每次将其值分配给另一个变量时,它们的值都会被复制。
答案 2 :(得分:1)
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;
}
这只适用于方法参数。
答案 3 :(得分:1)
unsafe
,否则无法在托管代码中使用指针。我建议反对。你可以做一些关闭到你想要的东西,但总的来说这不是一个好主意:
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
我认为更好的办法是找到解决问题的另一种方法。
答案 4 :(得分:0)
指针,正如您所想的那样,在托管C#代码中不存在。如果需要传递DateTime并更改原始值,则可能需要查看out
和ref
参数。由于DateTime是结构(值类型),因此除非您专门使用out
或ref
参数,否则它们始终被复制而不是通过引用传递。
答案 5 :(得分:0)
您可以将EventPointer
类型的Event1
,Event2
和DateTime
类型替换为DateTime?
。它使EventPointer的类型为可为空的引用类型。
DateTime? Event1 = DateTime.Now;
DateTime? Event2 = DateTime.Now.AddYears(10);
DateTime? EventPointer;
if (condition)
{
EventPointer = Event1;
}
else
{
EventPointer = Event2;
}
EventPointer.Value //.DoSomething