20210917のC#に関する記事は6件です。

【C#】ラムダ式とデリゲート型

C++でお世話になっていたラムダ式を、C#でも利用したいと思い調べました。 C++のラムダ式 auto Func = [](){}; Func(); C#のラムダ式 Action Func = () => {}; Func(); C++ のようにいちいちデリゲート型を宣言せずに型推論で利用したいところですが、「var」に入れようとするとコンパイルエラーになるので、どうしても利用したい場合には補助メソッドを作る必要がありそうです。 主なデリゲート(関数を入れる変数) Action Action<引数の型> Func<返り値の型> Func<返り値の型, 引数の型> ラムダ式やデリゲート型については下記サイト様が詳しく説明されています?  ➡ https://qiita.com/toRisouP/items/98cc4966d392b7f21c30
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityのインスペクターでEnumの一部項目を隠す方法

やりたい事 シリアライズされたEnumFieldの中身を変えずに、Editorで表示できる項目を制限したい: // サンプルEnumの定義 public enum ColorEnum { None = 0, Red = 1, Green = 2, Blue = 3 } そのままEditorで表示させる場合、すべての項目が選択可能 [SerializeField] ColorEnum myColor; このように、「HideEnumItem」という魔法Attributeをつける事で、Editorで表示された「myColor」から「None」と「Red」を隠したい [HideEnumItem("None", "Red"), SerializeField] ColorEnum myColor; 「HideEnumItem」という魔法Attributeは下記の「Custom Attribute」と「Custom Property Drawer」で用意する。 「Custom Attribute」を用意する 「Custom Attribute」はc#標準機能で、「SerializeField」のようなAttributeを自作することができます。 まずは通常のScriptsフォルダで下記の「HideEnumItemAttribute.cs」ファイルを作成: using System.Collections.Generic; using UnityEngine; // AttributeUsageで使用できる変数をクラスのフィールドに限定 [System.AttributeUsage(System.AttributeTargets.Field)] public class HideEnumItemAttribute : PropertyAttribute { // 隠したい項目を保存用 public HashSet<string> Filter { get; private set; } public HideEnumItemAttribute(params string[] filters) { Filter = new HashSet<string>(); for (var i = 0; i < filters.Length; i++) { Filter.Add(filters[i]); } } } 「Custom Property Drawer」を用意する 「Custom Property Drawer」はUnityEditorの機能で、Editorのインスペクター周りの描画をカスタマイズする事ができます。 上記のHideEnumItemAttributeを受け取って、指定された項目を隠す「HideEnumItemAttribute.cs」ファイルを作成(こちらはUnityEditorのAPIを使っているので、Editorフォルダに置く必要があります): using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; // 自作のAttributeを指定 [CustomPropertyDrawer(typeof(HideEnumItemAttribute))] public class HideEnumItemDrawer : PropertyDrawer { int selectedIndex; public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // Attribute取得 var filterInfo = (HideEnumItemAttribute)attribute; // eunmValueIndex変換用 var enum2index = new Dictionary<int, int>(property.enumNames.Length); for (int i = 0; i < property.enumNames.Length; i++) { var enumEntry = Enum.Parse(fieldInfo.FieldType, property.enumNames[i]); enum2index[(int)enumEntry] = i; } // 表示項目を加工 var filteredItems = property.enumNames.Where(item => !filterInfo.Filter.Contains(item)).ToList(); // Editor表示の同期 selectedIndex = filteredItems.IndexOf(property.enumNames[property.enumValueIndex]); // シリアライズされた値が範囲外だった場合、最初の項目に設定 if (selectedIndex < 0) { selectedIndex = 0; var mappedEnum = Enum.Parse(fieldInfo.FieldType, filteredItems[selectedIndex]); property.enumValueIndex = enum2index[(int)mappedEnum]; } // オリジナルの代わりに、加工されたリストを描画 using (var check = new EditorGUI.ChangeCheckScope()) { selectedIndex = EditorGUI.Popup(position, label.text, selectedIndex, filteredItems.ToArray()); if (check.changed) { // 元のEnum値に変換 var mappedEnum = Enum.Parse(fieldInfo.FieldType, filteredItems[selectedIndex]); property.enumValueIndex = enum2index[(int)mappedEnum]; } } } } まとめ このように「Custom Attribute」と「Custom Property Drawer」を組み合わせることで、汎用的かつ効率的なEditor拡張ができるようになるので、重宝したいですね。因みに、このような便利な「Custom Attribute」をたくさん用意してくれてるUnityアセットが「Odin Inspector And Serializer」になります。興味ある方はぜひチェックしてみてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C# 囲まれた文字列の取り出し

複数行も可能 var bb="{{{aiueo}}}".capture(@"{{{", @"}}}"); //aiueo public static class RegexStringExtension{ public static string capture(this string @this, string head, string tail) { /*usage var aa="(aiueo)".capture(@"\(",@"\)"); //aiueo var bb="{{{aiueo}}}".capture(@"{{{", @"}}}"); //aiueo */ var p = head + "(.*?)" + tail; var ma = Regex.Match(@this, p, RegexOptions.Singleline); if (!ma.Success) return ""; return ma.Groups[1].Value; } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#のプログラミング基本構文まとめ

なぜこの記事を書いたのか 業務でASP.NET Core(C#)を開発言語として使用することになったので、実務経験も踏まえて自分用としてこの記事にまとめることにした。 C#のサンプルプログラムを見てみよう C言語のように波括弧で囲む必要があり、VB.NETのように簡潔で分かりやすい構造となっている。 sample.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SampleName { class SampleClass { static void Main(string[] args) { //コンソール出力 Console.WriteLine("Qiita"); } } } 実行結果 Qiita ネームスペース(名前空間) プログラムに登場する「namespace」は、ネームスペース(名前空間)という。いわゆる、このプログラムを分類する「入れ物」の名前のこと。 このように記述すると波括弧に囲まれた要素は、ネームスペース「SampleName」に属することになる。 namespace SampleName クラス プログラムに登場する「class」は、クラスという。クラスはプログラムのまとまった単位の一つ。同一ネームスペースには、同じ名前のクラスが存在してはいけない。逆にパッケージが異なれば、同じクラス名が存在してもOKである。 このように記述すると波括弧に囲まれた要素は、クラス「SampleClass」に属することになる。 namespace SampleClass エントリーポイント プログラムの static void Main(string[] args) は、エントリーポイントという。C#はこの中に処理を書くことで、プログラムが実行される。1つのプロジェクトに1つのエントリーポイントしか置けない。 namespace SampleClass usingステートメント ”using (名前空間)”と言うように名前空間を指定すると、プログラムの中でその名前空間を利用すると言う宣言になる。 using 名前空間; コンソール出力 コンソール出力をおこなう。文字列や変数の中身を表示したいときに使用する。 出力(改行なし) Console.Write(内容); 出力(改行あり) Console.WriteLine(内容); コメント 処理の意味や注釈を記述するときに用いる。 行コメント // コメント ブロックコメント /* コメント コメント コメント */ 演算子 演算子を使用すると数値の足し算や引き算をおこなうことができる。 足し算 Console.WriteLine("{0} + {1} = {2}", 3, 4, 3 + 4); 引き算 Console.WriteLine("{0} - {1} = {2}", 8, 4, 8 - 4); 掛け算 Console.WriteLine("{0} * {1} = {2}", 2, 5, 2 * 5); 割り算 Console.WriteLine("{0} / {1} = {2}", 6, 2, 6 / 2); 剰余(あまり) Console.WriteLine("{0} % {1} = {2}", 7, 3, 7 % 3); 調べつつこれからも追記していきます。 参考 一週間で身につくC#言語の基本 https://csharp.sevendays-study.com/index.html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C# 基本文法まとめ

なぜこの記事を書いたのか 業務でASP.NET Core(C#)を開発言語として使用することになったので、実務経験も踏まえて自分用としてこの記事にまとめることにした。 C#のサンプルプログラムを見てみよう C言語のように波括弧で囲む必要があり、VB.NETのように簡潔で分かりやすい構造となっている。 sample.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SampleName { class SampleClass { static void Main(string[] args) { //コンソール出力 Console.WriteLine("Qiita"); } } } 実行結果 Qiita 基本文法 ネームスペース(名前空間) プログラムに登場する「namespace」は、ネームスペース(名前空間)という。いわゆる、このプログラムを分類する「入れ物」の名前のこと。 このように記述すると波括弧に囲まれた要素は、ネームスペース「SampleName」に属することになる。 sample.cs namespace SampleName クラス プログラムに登場する「class」は、クラスという。クラスはプログラムのまとまった単位の一つ。同一ネームスペースには、同じ名前のクラスが存在してはいけない。逆にパッケージが異なれば、同じクラス名が存在してもOKである。 このように記述すると波括弧に囲まれた要素は、クラス「SampleClass」に属することになる。 sample.cs namespace SampleClass エントリーポイント プログラムの static void Main(string[] args) は、エントリーポイントという。C#はこの中に処理を書くことで、プログラムが実行される。1つのプロジェクトに1つのエントリーポイントしか置けない。 sample.cs namespace SampleClass usingステートメント ”using (名前空間)”と言うように名前空間を指定すると、プログラムの中でその名前空間を利用すると言う宣言になる。 sample.cs using 名前空間; コンソール出力 コンソール出力をおこなう。文字列や変数の中身を表示したいときに使用する。 sample.cs // 出力(改行なし) Console.Write(内容); // 出力(改行あり) Console.WriteLine(内容); コメント 処理の意味や注釈を記述するときに用いる。 sample.cs // 行コメント /* ブロックコメント ブロックコメント ブロックコメント */ 演算子 演算子を使用すると数値の足し算や引き算をおこなうことができる。 sample.cs /* 足し算 */ Console.WriteLine("{0} + {1} = {2}", 3, 4, 3 + 4); /* 引き算 */ Console.WriteLine("{0} - {1} = {2}", 8, 4, 8 - 4); /* 掛け算 */ Console.WriteLine("{0} * {1} = {2}", 2, 5, 2 * 5); /* 割り算 */ Console.WriteLine("{0} / {1} = {2}", 6, 2, 6 / 2); /* 剰余(あまり) */ Console.WriteLine("{0} % {1} = {2}", 7, 3, 7 % 3); 変数 型 変数の先頭に型をつけることで、その変数がどのような値を保持できるのかを設定することができる。 タグ 説明 ビット 範囲 byte 符号なし整数 8 0 ~ 255 sbyte 符号付き整数 8 -128 ~ 127 int 符号付き整数 32 -2,147,483,648 ~ 2,147,483,647 uint 符号なし整数 32 0 ~ 4294967295 short 符号付き整数 16 -32,768 ~ 32,767 ushort 符号なし整数 16 0 ~ 65535 long 符号付き整数 64 -922337203685477508 ~ 922337203685477507 ulong 符号なし整数 64 0 ~ 18446744073709551615 float 単精度浮動小数点型 32 -3.402823e38 ~ 3.402823e38 double 倍精度浮動小数点型 64 -1.79769313486232e308 ~ 1.79769313486232e308 char 単一 Unicode 文字 16 テキストで使用される Unicode 記号 bool ブール型 8 True または False object 他のすべての型の基本型 string 文字列 decimal 29 の有効桁数で 10 進数を表現できる正確な小数または整数型 128 ±1.0?×?10e ? 28 ~ ±7.9?×?10e28 初期化 変数は宣言時に値を初期化することができる。 sample.cs // 宣言と同時に値を代入(=初期化) int a = 3; // 変数num, num2を宣言 int num, num2; // 変数num, num2を初期化 int num=1, num2=0 // 変数num, num2を宣言 変数num2のみ初期化 int num, num2=4 代入演算子 変数へ値を代入するときに使用する「=」を代入演算子という。今回は代入演算子の省略形を紹介する。 sample.cs // a = a + 5; の省略形 a += 1; // a = a - 1; の省略形 a -= 1; // a = a * 1; の省略形 a *= 1; // a = a / 1; の省略形 a /= 1; // a = a % 1; の省略形 a %= 1; キャスト キャストとは型を変換すること。例えば数値を文字列型の変数へ代入したい場合は、数値を文字列に変換する必要がある。 sample.cs // double型をint型へ変換する i_num = (int)2.22; // String型をint型へ変換する i_num = int.Parse("100"); // String型をint型へ変換する i_num = ToInt32("200"); 文字列の入力 ユーザに文字列の入力を求めることができる。 sample.cs string str1; str1 = Console.ReadLine(); 定数 変数は値の変更が可能だが、定数は値の変更ができない。途中で値を変更したくない場合に使用する。 sample.cs const int num = 50; Console.WriteLine(num); 分岐処理 判定文の結果によって処理を分岐することができる。 sample.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Sample301 { class Program { static void Main(string[] args) { Console.Write("整数値を入力してください:"); // 入力値を取得 int num = int.Parse(Console.ReadLine()); Console.WriteLine("入力値:" + num); // 入力値が偶数か if(num % 2 = 0) { Console.WriteLine("偶数です"); } } } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#でIDisposableをusingしたのにDisposeしてくれない件

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む