sawahiko’s diary

学習ブログです

(能力向上) Visual Studio Communityでコード分析を実行する

ユースケース

  • 自分の書いたコードが良いのか悪いのか分からない
  • もっと上手にコードを書きたい

という場合、静的コード分析をかける習慣によってコーディングの上達を目指せる。

分析ルールの設定方法

  • 「プロジェクトのプロパティ」→「コード分析」にて設定する

f:id:yoshihi69:20150514212504p:plain

実行と分析結果

  • Alt+F11で実行 (「ビルド」→「ソリューションでコード分析を実行」のショートカット)
  • コード分析ウィンドウに結果が表示される

f:id:yoshihi69:20150514212506p:plain

  • 試しに分析ルールを「Microsoftのすべての規則」にしてみると

f:id:yoshihi69:20150515213308p:plain
たくさん出ます。
この指摘事項を減らすようにコーディングしていくと…、その内上達しているはずです。

体系的な学習はこちら

独習C# 第3版

独習C# 第3版

(C#) ComboBoxのアイテムに表示名と値をあてる

ユースケース

ComboBoxにおいて「ある選択ならこの値」と、表示名と値を関連付けさせたい場合がある。そんな場合に便利。

コード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ComboBoxDispalyValue
{
    public partial class Form1 : Form
    {
        public class ItemSet{
            // DisplayMemberとValueMemberにはプロパティで指定する仕組み
            public String   ItemDisp    { get; set; }
            public int      ItemValue   { get; set; }

            // プロパティをコンストラクタでセット
            public ItemSet(int v, String s){
                ItemDisp    = s;
                ItemValue   = v;
            }
        }

        public Form1()
        {
            InitializeComponent();

            // ComboBox用データ作成 //ListでOK //IList インターフェイスまたは IListSource インターフェイスを実装する、DataSet または Array などのオブジェクト。
            List<ItemSet> src = new List<ItemSet>();
            src.Add(new ItemSet(100, "Number1"));/// 1つでItem1つ分となる
            src.Add(new ItemSet(200, "Number2"));
            src.Add(new ItemSet(300, "Number3"));

            // ComboBoxに表示と値をセット
            comboBox1.DataSource    = src;
            comboBox1.DisplayMember = "ItemDisp";
            comboBox1.ValueMember   = "ItemValue";

            // 初期値セット
            comboBox1.SelectedIndex = 0;
            comboBox1_SelectedIndexChanged(null, null);
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            // labelに現在コンボ選択の内容を表示
            ItemSet tmp = ((ItemSet)comboBox1.SelectedItem);//表示名はキャストして取りだす
            labelDisplay.Text = tmp.ItemDisp;
            labelValue.Text   = comboBox1.SelectedValue.ToString();//値はそのまま取りだせる
        }
    }
}


結果GUI

ComboBoxの選択に応じた、表示名と値が下部に表示される。
f:id:yoshihi69:20150513225701p:plain

体系的に学習する場合はこちら

独習C# 第3版

独習C# 第3版

その他

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Test_Enum
{
public enum EGains {G0, G1, G2, G3, G4, G5, G6, TL = 14}//enumの値をswitch文にも使いたい

public partial class Form1 : Form
{
private Dictionary<string, EGains> data;

public Form1()
{
InitializeComponent();

//ComboBoxのItem名とレジスタ値(enumの値)の紐付け
data = new Dictionary<string, EGains>();
data.Add("Gain0" , EGains.G0);
data.Add("Gain1" , EGains.G1);
data.Add("Gain2" , EGains.G2);
data.Add("Gain3" , EGains.G3);
data.Add("Gain4" , EGains.G4);
data.Add("Gain5" , EGains.G5);
data.Add("Gain6" , EGains.G6);
data.Add("THERMO_LEVEL" , EGains.TL);

// ComboBoxのItem名割り当て
string ss = new string[data.Count()];
int i = 0;
foreach (String k in data.Keys)
{
ss[i++] = k;
}
//string
ss = new string[] { "Gain0", "Gain1", "Gain2", "Gain3", "Gain4", "Gain5", "Gain6", "THERMO_LEVEL" };
comboBox1.Items.AddRange(ss);

comboBox1.SelectedIndex = 0;//初期値は先頭
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//7選んだらレジスタに14が入るようにする
//ここはSelectIndex=0~7しか入りようがない
//numericUpDown1.Value = EGains.[comboBox1.SelectedIndex];
this.numericUpDown1.ValueChanged -= new System.EventHandler(this.numericUpDown1_ValueChanged);

numericUpDown1.Value = (int)data[comboBox1.SelectedItem.ToString()];//[理解]Dictionaryに値が無い時はエラーになる
label_nInterlock.Text = numericUpDown1.Value.ToString();

this.numericUpDown1.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged);

}

//レジスタ値代わり
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
//14選んだら7が入るようにする
//6~13選んだら7が入るようにする
this.comboBox1.SelectedIndexChanged -= new System.EventHandler(this.comboBox1_SelectedIndexChanged);

//[異常系対応]0未満なら0,14超過なら14 //0来なくない? //なので無ければサーモ固定で良いかな
String retKey = data.FirstOrDefault(x => (int)x.Value == numericUpDown1.Value).Key;//Linqで逆引き //dictionaryにキーが無い時は空が返る
//if (retKey == null)
//{
// //異常値はTHERMO_LEVEL。違和感有り。おかしい値なのに設定しちゃうのはやめたい。//無視としよう
// comboBox1.SelectedItem = "THERMO_LEVEL";
// label_nInterlock.Text = data["THERMO_LEVEL"].ToString();
//}
//else
//{
if (retKey == null) { return; }//異常値は無処理が自然
comboBox1.SelectedItem = retKey;
label_nInterlock.Text = numericUpDown1.Value.ToString();

this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);

}
}
}

第13章:Generic

 

[基本]

  • <T>:型パラメータと呼ぶ。使用時に型を入れられる。<int>や<String>など
  • しかしどんな型でも入れられるようにしておくと、対応できない場合があるので、入れられる型に制約を設ける事が出来る。この型パラメータの制約はいくつか種類がある。

[利点]

  • 従来もObject型で同様の機能を行えた。しかし明示的なキャストが必要である、実行時エラーとなってしまう、等のデメリットが有りGenericの方が優れている。

[型パラメータの制約]

基本クラス制約

例えばGetA()を内部で使うので、GetA()を持つClassAとその派生クラスしか型パラメータに入れさせたくない

Class GenericClass <T> where T : ClassA // ClassAとその派生しかTに入れられない

インターフェイス制約

Class GenericClass <T> where T : IInterface // IInterfaceそのものorその派生or実装したクラスのみ型パラメータに入れさせたくない

コンストラクター制約(new()制約):

引数無しコンストラクタを持つ事を必須としている。これを付けると、内部でコンストラクタが使える=インスタンス生成できる

Class GenericClass <T> where T : new() // 引数無しコンストラクタ必須とします

参照型制約

Class GenericClass <T> where T : Class // 参照型のみTに入れられます。(ex)Class

値型制約

Class GenericClass <T> where T : Struct // 値型のみTに入れられます。(ex)intやstruct

f:id:yoshihi69:20150511181816j:image

 

独習C# 第3版

独習C# 第3版