[Unity] C#6 を使う

C#6

自動実装プロパティ用の初期化子

public string First { get; set; } = "Taro";
自動実装プロパティに初期化子をつけることができるようになりました。
これができるようになったのは Unity2017 からだったと思います。
これだけでUnity2017にする価値があったといえる機能です。懐かしい。

ラムダ式本体によるメソッドの記述

public double Distance(Vector2 p) => Mathf.Sqrt((p.x - 1) * (p.x - 1) + (p.y - 1) * (p.y - 1));
簡単な関数ならラムダ式(なんかこんな=>やつ)であっさり書くことができました。

ラムダ式本体によるプロパティの記述

public double FirstLength => First.Length;
プロパティもラムダ式でできます。

Null条件演算子

List<vector2> point = null;
Vector2? first = point?[0];
second = first ?? Vector2.zero;
Debug.Log($"{second}");
// (0.0, 0.0)
"??"演算子は、ヌルだった場合に実行させることができます。
この場合、firstがnullだとVector2.zeroを、nullじゃなければfirstがそのままsecondに代入されます。

文字列補間

Debug.Log($"Coin flip: {(Random.value < 0.5f ? "heads" : "tails")}"); // Coin flip: tails

文字列の前に"$"を付けることで"{}"中に直接、変数なんかを記述することができます。
この例だと実行するたびに結果が変わる可能性があります。
$"{Month}月{Day}日"なんかで利用すると便利です。

nameof演算子

Debug.Log(nameof(First));
// First
変数名が文字列になります。デバッグやツール用に使えそうです。

例外フィルター

catch (System.Net.WebException e) when (e.Status == System.Net.WebExceptionStatus.NameResolutionFailure)
例外を利用するときに、さらに分類することができます。

finallyブロック内でのawait

catchやfinallayなんかでもawaitができるようになったみたいです。

ソースコードはこちらpiyo

#if UNITY_EDITOR
using System.Collections.Generic;
using UnityEngine;
public class CS6Test : MonoBehaviour
{
#region 自動実装プロパティ用の初期化子
public string First { get; set; } = "Taro";
public string Last { get; } = "Tanaka";
#endregion
#region ラムダ式本体によるメソッドの記述
public double Distance(Vector2 p) => Mathf.Sqrt((p.x - 1) * (p.x - 1) + (p.y - 1) * (p.y - 1));
#endregion
#region ラムダ式本体によるプロパティの記述
public double FirstLength => First.Length;
#endregion
void Start()
{
#region Null条件演算子
List<Vector2> point = null;
Vector2? first = point?[0];
// デフォルト値をNull合体演算子(??)で記述できる
Vector2 second = first ?? Vector2.zero;
Debug.Log($"{second}");
// (0.0, 0.0)
#endregion
#region 文字列補間
Debug.Log($"Item name is {First,20} {{-}}");
// Item name is Taro {-}
Debug.Log($"Coin flip: {(Random.value < 0.5f ? "heads" : "tails")}");
// Coin flip: tails
#endregion
#region nameof演算子
Debug.Log(nameof(First));
// First
#endregion
}
#region 例外フィルター
public static void Execute()
{
try
{
Debug.Log("DoSomeHttpRequest();");
}
catch (System.Net.WebException e) when (e.Status == System.Net.WebExceptionStatus.NameResolutionFailure)
{
Debug.Log("名前解決できませんでした");
}
catch (System.Net.WebException e) when (e.Status == System.Net.WebExceptionStatus.RequestCanceled)
{
Debug.Log("リクエストがキャンセルされました");
}
catch
{
Debug.Log("その他のエラー");
}
}
#endregion
#region MyRegion
public async void Sync()
{
await new System.Threading.Tasks.Task(() => { });
#region およびfinallyブロック内でのawait
//var req = new MyRequest();
//try
//{
// var res = await req.SendAsync(); // 非同期メソッド
//}
//catch (Exception e)
//{
// await req.RetryAsync();
//}
//finally
//{
// if (req != null) await req.CloseAsync();
//}
#endregion
}
#endregion
}
#endif
view raw CS6Test.cs hosted with ❤ by GitHub

C#6ではUnityでも実用的なものが実装されました。
とっても便利です。
次は最後、本命のC#7へ

CITY 8巻
僕のヒーローアカデミア 24巻
メイドインアビス(8)
ハクメイとミコチ 7巻

0 件のコメント :

コメントを投稿