有没有可能创建一个C#&x27;指针';到DateTime对象?

有没有可能创建一个C#&x27;指针';到DateTime对象?,c#,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.DoSom

是否可以创建一个指向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.
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));

DateTimes是值类型,与引用类型不同,每次您将其值分配给另一个变量时,它们的值都会被复制。

指针,正如您所想的那样,在托管C#代码中不存在。如果需要传递日期时间并更改原始值,则可能需要查看
out
ref
参数。由于日期时间是结构(值类型),因此它们总是被复制而不是通过引用传递,除非您特别使用
out
ref
参数

不直接,但您可以将其包装在类中:

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()
    {
    }
}

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;
}
这仅适用于方法参数

  • 除非使用
    不安全的
    ,否则不能在托管代码中使用指针。我建议不要这样做
  • 日期时间是不可变的。修改DateTime类型的变量所能做的唯一一件事就是重新分配给它
  • 你可以做一些接近你想要做的事情,但总的来说,这样做不是一个好主意:

    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.
    
    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));
    
    DateTime event1=新的DateTime(2011,10,11);
    DateTime event2=新的日期时间(2021,10,11);
    操作eventPointer;//指针?
    如果(真)
    {
    eventPointer=x=>{event1=x;};
    }
    其他的
    {
    eventPointer=x=>{event2=x;};
    }
    eventPointer(新日期时间(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 10/11/2016 00:00:00 10/11/2021 00:00:00
    我认为最好是找到另一种解决问题的方法。

    您可以将
    EventPointer
    的类型、
    Event1
    Event2
    类型从
    DateTime
    类型替换为
    DateTime?
    。它使EventPointer的类型可以为null引用类型

    DateTime? Event1 = DateTime.Now;
    DateTime? Event2 = DateTime.Now.AddYears(10);
    
    DateTime? EventPointer;  
    
    if (condition)
    {
        EventPointer = Event1;
    }
    else
    {
        EventPointer = Event2;
    }
    
    EventPointer.Value //.DoSomething
    

    这就是我要找的。不知何故,我认为DateTime是一个类,而不是一个结构。