c# - 我们可以在 C# 中使用 Struct 作为引用类型吗?

标签 c# unity3d struct

<分区>

这是来自 Unity3D 的示例:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ParticleLauncher : MonoBehaviour {

    public ParticleSystem particleLauncher;
    public ParticleSystem splatterParticles;
    public Gradient particleColorGradient;
    public ParticleDecalPool splatDecalPool;

    List<ParticleCollisionEvent> collisionEvents;

    void Start () 
    {
        collisionEvents = new List<ParticleCollisionEvent> ();
    }

    void OnParticleCollision(GameObject other)
    {
        ParticlePhysicsExtensions.GetCollisionEvents (particleLauncher, other, collisionEvents);

        for (int i = 0; i < collisionEvents.Count; i++) 
        {
            splatDecalPool.ParticleHit (collisionEvents [i], particleColorGradient);
            EmitAtLocation (collisionEvents[i]);
        }

    }

    void EmitAtLocation(ParticleCollisionEvent particleCollisionEvent)
    {
        splatterParticles.transform.position = particleCollisionEvent.intersection;
        splatterParticles.transform.rotation = Quaternion.LookRotation (particleCollisionEvent.normal);
        ParticleSystem.MainModule psMain = splatterParticles.main;
        psMain.startColor = particleColorGradient.Evaluate (Random.Range (0f, 1f));

        splatterParticles.Emit (1);
    }

    void Update () 
    {
        if (Input.GetButton ("Fire1")) 
        {
            ParticleSystem.MainModule psMain = particleLauncher.main;
            psMain.startColor = particleColorGradient.Evaluate (Random.Range (0f, 1f));
            particleLauncher.Emit (1);
        }

    }
}

您可以在此处找到其余代码:

enter link description here

我的问题是关于 EmitAtLocation() 函数,在这个函数中我们有

ParticleSystem.MainModule psMain = splatterParticles.main; 

MainModule 是一个结构,我知道 C# 中的结构是通过值而不是通过引用传递的,但是这里我们有 psMain 变量,如果我们对该变量做任何更改,splatterParticles.main 将受到影响,它看起来像结构已通过引用传递,在 C# 中是可能的还是我遗漏了什么?

最佳答案

幕后有一个把戏。

首先,让我们看一下 ParticleSystem.main 属性:

public ParticleSystem.MainModule main
{
  get
  {
    return new ParticleSystem.MainModule(this);
  }
}

我们看到它返回一个新的 MainModule 结构,它以 this 作为参数。 然后让我们看一下 MainModule 的构造函数:

  private ParticleSystem m_ParticleSystem;

  internal MainModule(ParticleSystem particleSystem)
  {
    this.m_ParticleSystem = particleSystem;
  }

所以我们保留对 ParticleSystem 的引用(注意 ParticleSystem 是一个类)。 最后,startColor 属性:

  public ParticleSystem.MinMaxGradient startColor
  {
    set
    {
      ParticleSystem.MainModule.SetStartColor(this.m_ParticleSystem, ref value);
    }
    get
    {
      ParticleSystem.MinMaxGradient gradient = new ParticleSystem.MinMaxGradient();
      ParticleSystem.MainModule.GetStartColor(this.m_ParticleSystem, ref gradient);
      return gradient;
    }
  }

简而言之,您的 ParticleSystem.MainModule 对象实际上并不存储任何内容。它只是全局共享 ParticleSystem 对象的包装器。每当您访问 ParticleSystem.MainModule 上的属性时,它都会直接修改共享的 ParticleSystem。因此,您会看到令人困惑的行为。

关于c# - 我们可以在 C# 中使用 Struct 作为引用类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47855259/

相关文章:

c# - WPF Datagrid IValueConverter ConvertBack 自己类的对象

c# - 我得到统一的错误CS1061(您是否缺少using指令或程序集引用?)

string - 结构 str 属性必须是引用?

c - 不兼容的指针类型错误 C

c# - NUnit Assert.AreEqual 日期时间公差

c# - OWIN 安全性 - 如何在维护身份验证承载 token 的同时返回 cookie 中的刷新 token

unity3d - 如何使 2D 碰撞器随它们绑定(bind)到的 UI 元素缩放?

c# - 属性私有(private)集崩溃统一

c - 结构类型转换 ANSI C 89

c# - 我可以将 C# 字符串值转换为转义字符串文字吗?