相关疑难解决方法(0)

如何通过"引用"将其分配给c#中的类字段?

我试图了解如何通过"引用"分配给c#中的类字段.

我有以下示例要考虑:

 public class X
 {

  public X()
  {

   string example = "X";

   new Y( ref example );

   new Z( ref example );

   System.Diagnostics.Debug.WriteLine( example );

  }

 }

 public class Y
 {

  public Y( ref string example )
  {
   example += " (Updated By Y)";
  }

 }

 public class Z
 {

  private string _Example;

  public Z( ref string example )
  {

   this._Example = example;

   this._Example += " (Updated By Z)";

  }

 }

 var x = new X();
Run Code Online (Sandbox Code Playgroud)

运行上面的代码时,输​​出是:

X(由Y更新)

并不是: …

c# parameters field reference

27
推荐指数
2
解决办法
3万
查看次数

将TypedReference保持在方法块之外,而不返回它

我想假设这个问题的目的是检查是否至少有一种方法,即使通过最不安全的黑客,仍然保持对非blittable值类型的引用.我知道这种设计类型与犯罪相当; 除了学习之外,我不会在任何实际案例中使用它.因此,请接受现在阅读异常不安全的代码.

我们知道可以以这种方式存储和增加对blittable类型的引用:

unsafe class Foo
{
    void* _ptr;

    public void Fix(ref int value)
    {
        fixed (void* ptr = &value) _ptr = ptr;
    }

    public void Increment()
    {
        var pointer = (int*) _ptr;
        (*pointer)++;
    }
}
Run Code Online (Sandbox Code Playgroud)

在安全性方面,上述类别可以与虚空中的跳跃相媲美(没有双关语意),但正如这里已经提到的那样.如果在堆栈上分配的变量传递给它,然后调用方法的作用域终止,则可能会遇到错误或显式访问冲突错误.但是,如果您执行这样的程序:

static class Program
{
    static int _fieldValue = 42;

    public static void Main(string[] args)
    {
        var foo = new Foo();
        foo.Fix(ref _fieldValue);
        foo.Increment();
    }
}
Run Code Online (Sandbox Code Playgroud)

在卸载相关应用程序域之前,不会处理该类,因此适用于该字段.老实说,我不知道高频堆中的字段是否可以重新分配,但我个人认为不是.但是现在让我们放弃安全(如果可能的话).在阅读了这个这些问题后,我想知道是否有办法为非blittable静态类型创建类似的方法,所以我制作了这个程序,它实际上有效.阅读评论以了解它的作用.

static class Program
{
    static Action _event;

    public static …
Run Code Online (Sandbox Code Playgroud)

c# delegates unsafe ref typedreference

11
推荐指数
1
解决办法
994
查看次数

标签 统计

c# ×2

delegates ×1

field ×1

parameters ×1

ref ×1

reference ×1

typedreference ×1

unsafe ×1