轩辕kuku
论坛版主
论坛版主
  • UID14
  • 粉丝6
  • 关注1
  • 发帖数78
  • 社区居民
  • 原创写手
阅读:1010回复:3

C#开发基础——static、ref和out关键字使用

楼主#
更多 发布于:2016-05-22 17:57
前面简单的描述了一下类和结构体的包含的东西和一些区别。结构体在unity开发中大部分用来作为数据结构存储数据,类的使用会多的多,而且也会复杂很多。在说一些在类的开发中需要注意到的问题。
(1)关键词static
static关键词大家都比较熟悉——静态,类中的成员字段、属性和方法都可以用改关键词来描述,类本身可以用关键词来描述。
首先拿字段来说,在Unity3d开发的时候,很多继承到MonoBehaviour,同一个类绑在不同的GameObject上面都是一个实例,不用的实例操作该类的字段都是互不影响的。比如:

图片:111.png



普通字段:
public class StaticClassTest : MonoBehaviour
{
    private  string testValue;
    // Use this for initialization
    void Start () {
        testValue = transform.name;
        }
      
    // Update is called once per frame
    void Update () {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log(" testValue of" + transform.name + " is :" + testValue);
        }
    }
}
测试结果:

图片:QQ图片20160522171247.png



静态字段:
public class StaticClassTest : MonoBehaviour
{
    private static string testValue;
    // Use this for initialization
    void Start () {
        testValue = transform.name;
        }
      
    // Update is called once per frame
    void Update () {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log(" testValue of" + transform.name + " is :" + testValue);
        }
    }
}
测试结果:

图片:3.png



结果可以对比出来,但为什么静态字段的时候,全是GameObject005而不是001、002或者其他,这个是受Unity中实例化的时候Start的执行顺序的影响。不同的脚本的执行顺序可以在MonoManager中进行调整。其次是静态属性,静态属性其实大家可以参考一下前面的文章(Unity开发基础之单例模式),单例模式的开发里面,单例就是一个静态的属性;

静态方法可以修饰构造函数,也可以修饰一般方法。不管修饰哪一种,函数体内部使用的字段和属性必须也是静态的。其中作为静态的构造函数,只能有一个,而且该构造函数类调用的时候只会执行一次,一般用于该类的一些静态变量的初始化。
静态的类,使用static修饰过的类不允许被实例化,而且成员必须全部是静态的,若要使用静态类中的成员,直接类名加成员既可以,一般用于工具类的定义;
public static class JsonUtils
{
    public static string JsonData;
    public static void ReadJsonData(string _data)
    {
    }
}
public class StaticClassTest : MonoBehaviour
{
    void Start()
    {
        JsonUtils.JsonData = "arvrschool";
        JsonUtils.ReadJsonData("arvrschool");
    }
}
(2)ref和out的使用
ref关键字可以将一个参数传入方法,方法对该参数的操作变化,都会影响到参数本身。
private static string testValue = "11111";
// Use this for initialization
void Start()
{
    HandleString1(testValue);
    Debug.Log(testValue);
    HandleString2(ref testValue);
    Debug.Log(testValue);
}
  
void HandleString1(string _s)
{
    _s += "被处理过的string";
}
  
void HandleString2(ref string _s)
{
    _s += "被处理过的string";
}
测试结果:

图片:6.png



out关键字用于一个函数的多返回值,通过out关键字定义的变量可以不被初始化。比较熟悉的有,在Unity3D中做碰撞检测的时候射线检测函数包含有该参数,可以参考Unity3D的官网:http://docs.unity3d.com/ScriptReference/Physics.Raycast.html
public class RaycastExample : MonoBehaviour
{
    public Missile missile;
  
    void FixedUpdate()
    {
        RaycastHit hit;
  
        if (Physics.Raycast(transform.position, -Vector3.up, out hit, 100.0f))
            print("Found an object - distance: " + hit.distance);
    }
}

欢迎分享

1739516172
精灵王
精灵王
  • UID748
  • 粉丝0
  • 关注3
  • 发帖数52
  • 社区居民
  • 忠实会员
沙发#
发布于:2016-05-23 19:08
1739516172
精灵王
精灵王
  • UID748
  • 粉丝0
  • 关注3
  • 发帖数52
  • 社区居民
  • 忠实会员
板凳#
发布于:2016-05-23 19:16
可以推荐一本关于C#开发基础的书吗,感觉自己这方面很不足
轩辕kuku
论坛版主
论坛版主
  • UID14
  • 粉丝6
  • 关注1
  • 发帖数78
  • 社区居民
  • 原创写手
地板#
发布于:2016-05-23 20:05
1739516172:可以推荐一本关于C#开发基础的书吗,感觉自己这方面很不足回到原帖
如果你有点编程基础的话,直接上个项目或者做个demo之类,不懂的看帖子,弄一段时间后,再找一本书看,带着问题去看书
游客

返回顶部