是否可以为DateTime对象创建一个C#'指针'?

时间:2011-10-11 16:34:48

标签: 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.

6 个答案:

答案 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)

  1. 除非使用unsafe,否则无法在托管代码中使用指针。我建议反对。
  2. DateTimes是不可变的。修改DateTime类型的变量唯一可以做的就是重新分配它。
  3. 你可以做一些关闭到你想要的东西,但总的来说这不是一个好主意:

    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并更改原始值,则可能需要查看outref参数。由于DateTime是结构(值类型),因此除非您专门使用outref参数,否则它们始终被复制而不是通过引用传递。

答案 5 :(得分:0)

您可以将EventPointer类型的Event1Event2DateTime类型替换为DateTime?。它使EventPointer的类型为可为空的引用类型。

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

DateTime? EventPointer;  

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

EventPointer.Value //.DoSomething