20200522のC#に関する記事は4件です。

フィールドとプロパティの違い

背景

入社して2年。なんちゃってSEになる気がしてきたので。。。
(まともにプログラム勉強する時間なんかねーよ)
C#をこれからまじめに勉強する。(つもり)

初めて2週間さっそく、フィールドとプロパティの違いがわからなくなり
ここに備忘録として記す。

実行プログラム

本の値段を変数へ格納して、割引した値段を出力する。

    class Program
    {
        static void Main(string[] args)
        {
            //オブジェクト
            Book0 book0 = new Book0();
            Book1 book1 = new Book1();
            Book2 book2 = new Book2();

            //価格
            book0.price = 100;
            book1.set(1000);
            book2.price = 10000;

            //値引き率
            book0.rate = 0.8;
            book1.rate = 0.8;
            book2.rate = 0.8;

            //表示
            Console.WriteLine(book0.price * book0.rate);
            Console.WriteLine(book1.get());
            Console.WriteLine(book2.price);

            Console.ReadKey();
        }
    }

    //フィールドのみのクラス
    class Book0
    {
        public double price;
        public double rate;
    }

    //フィールドとメソッドを持つクラス
    class Book1
    {
        private double _price;
        public double rate;

        public double get()
        {
            return _price * rate;
        }
        public void set(double value)
        {
            _price = value;
        }
    }

    //プロパティのみを持つクラス
    class Book2
    {
        public double rate { get; set; }
        private double _price;
        public double price
        {
            get
            {
                return _price * rate;
            }
            set
            {
                _price = value;
            }
        }
    }

違い

・プロパティを用いると、setとgetで別々の処理をすることができる。
 つまり、値段を変えず(setせず)に、値を取得(get)することができる。
・クラスBook1で記述している通り、プロパティはgetメソッド・setメソッドの関数が入っているようなものである。
・クラスBook0:フィールド同士の掛け算、クラスBook1:getメソッド、クラスBook2:プロパティ
 で、割引した値段を取ることができる。

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

WPFでBitmapImageクラスを用いた時に、読み込んだ画像ファイルをプロセスで占有しない方法

はじめに

WPF で BitmapImageクラスを用いた時に、ヘルプページなどのよくある実装例をそのまま利用すると、読み込んだ画像ファイルを対象アプリケーションのプロセスが占有してしまい、アプリケーションを終了するまで、その画像ファイルを変更・削除できなくなります。
その回避策の紹介です。

BitmapImage クラスのヘルプはこちら

回避策

BitmapImage クラスには、BitmapImage.CacheOption プロパティというものがあり、これを変更することで、メモリ上に画像ファイルを保持する期間が変更できます。
BitmapImage.CacheOption プロパティ

上記プロパティを OnLoad に設定することで、読み込み後に画像ファイルを占有しなくなります。

具体的には、以下のコードになります。

BitmapImage bmpImage = new BitmapImage();
using (FileStream stream = File.OpenRead(filePath))
{
    bmpImage.BeginInit();
    bmpImage.CacheOption = BitmapCacheOption.OnLoad;  // ここが重要
    bmpImage.StreamSource = stream;
    bmpImage.EndInit();
    stream.Close();
}

以下にも同様のことが書かれていました。
How to free the memory after the BitmapImage is no longer needed?
ファイルから解放可能なBitmapImageを読み込む

まとめ

私はWPFを用いて こちらのツール を作っています。

Twitterでも開発に役立つ情報を発信しています → @kojimadev

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

C#でstaticが何か分からずに詰まってしまったので備忘録

初投稿です。Unity初心者の私がstaticが何者なのか分からなくなったので忘れないように記しておきます。
間違っていたら指摘していただけると嬉しいです

Staticとは何ぞ?

Staticは静的と訳されています
クラスのメンバーを定義する時に下記のようにstaticを付けることで
static 型名 フィールド名 (例: static float Sin)
その変数は静的変数・静的メソッドになります

静的って何だよ

静的とは、静的メンバー(クラスやオブジェクトの持つ変数や関数)の宣言に使用します。
静的メンバーは、特定のオブジェクトではなく、型自体に属するメンバーです。
少なくとも
・静的である=>動かなく値は固定=>(constのような)定数
という事ではないです。自分は脳内でこのように勝手に変換してしまってハマっていました。

じゃあ何をやっているの?

staticはそのクラスが持つ変数やメソッドで有ることを示します。
動かせないお弁当箱を置いておくようなもので中身を見たり中身を入れ替えたり出来ます。

いちいちインスタンスを取得してからアクセスしていましたが、
インスタンスを取得せずアクセスできるようになります。

静的クラス

下記のようにstaticを付けることでstaticとして宣言され、staticメソッドのみが含まれます
public static class Math

public static class Math //静的クラス
{
    public static readonly float PI = 3.14f;
    public static float CircumferenceLength(float diameter) 
    {
        return diameter * PI; //直径から円周を返す雑メソッド
    }

    //static(静的クラスでは)が無いのでエラー
    //静的クラスでインスタンスのメンバーを宣言することはできません。と言われる
    public /*static*/ int Abs(float val) 
    {
        return (int)Mathf.Abs(val); //絶対値にしてintで返すメソッド、なおエラーを吐く
    }
}

静的フィールドとメソッド

この例では、新しい従業員の名前と ID を読み取り、従業員数のカウンターを 1 つインクリメントして、新しい従業員の情報と従業員数を表示します。

NAKAMA_Manager.cs
using UnityEngine;

public class NAKAMA_Manager : MonoBehaviour
{
    public void Start()
    {
        var employee1 = new Employee("一般人", 5);
        Employee.AddEmployee();
        Debug.Log($"NAME: {employee1.name}");
        Debug.Log($"HP: {employee1.hp}");
        Debug.Log($"Employee数: {Employee.employeeCounter}"); //Employeeクラスにアクセス

        var employee2 = new Employee("パチュリー", 30000);
        Employee.AddEmployee();
        Debug.Log($"NAME: {employee2.name}");
        Debug.Log($"HP: {employee2.hp}");
        Debug.Log($"Employee数: {Employee.employeeCounter}"); 
    }
}

public class Employee //従業員
{
    public string name; //インスタンスされる度(newされる度)に生成される変数)
    public int hp; //インスタンスされる度(newされる度)に生成される変数)

    public Employee(string name, int hp)
    {
        this.name = name;
        this.hp = hp;
    }

    public static int employeeCounter; //クラスが持つ変数
    public static int AddEmployee() 
    {
        employeeCounter++;
        return employeeCounter;
    }
}

実行結果
image.png

まとめ

・クラスのメンバーを定義する時にstaticを付けると静的宣言、静的メソッドになる
・静的メンバーは、特定のオブジェクトではなく、型自体に属する
・インスタンスを取得せずともアクセスできるようになる

参考にしたサイト

https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/static

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

Unityでstaticが何か分からずに詰まってしまったので備忘録

初投稿です。Unity初心者の私がstaticが何者なのか分からなくなったので忘れないように記しておきます。
間違っていたら指摘していただけると嬉しいです

Staticとは何ぞ?

Staticは静的と訳されています
クラスのメンバーを定義する時に下記のようにstaticを付けることで
static 型名 フィールド名 (例: static float Sin)
その変数は静的変数・静的メソッドになります

静的って何だよ

静的とは、静的メンバー(クラスやオブジェクトの持つ変数や関数)の宣言に使用します。
静的メンバーは、特定のオブジェクトではなく、型自体に属するメンバーです。
少なくとも
・静的である=>動かなく値は固定=>(constのような)定数
という事ではないです。自分は脳内でこのように勝手に変換してしまってハマっていました。

じゃあ何をやっているの?

staticはそのクラスが持つ変数やメソッドで有ることを示します。
動かせないお弁当箱を置いておくようなもので中身を見たり中身を入れ替えたり出来ます。

Unityではいちいちインスタンスを取得してからアクセスしていましたが、
インスタンスを取得せずアクセスできるようになります。

静的クラス

下記のようにstaticを付けることでstaticとして宣言され、staticメソッドのみが含まれます
public static class Math

public static class Math //静的クラス
{
    public static readonly float PI = 3.14f;
    public static float CircumferenceLength(float diameter) 
    {
        return diameter * PI; //直径から円周を返す雑メソッド
    }

    //static(静的クラスでは)が無いのでエラー
    //静的クラスでインスタンスのメンバーを宣言することはできません。と言われる
    public /*static*/ int Abs(float val) 
    {
        return (int)Mathf.Abs(val); //絶対値にしてintで返すメソッド、なおエラーを吐く
    }
}

静的フィールドとメソッド

この例では、新しい従業員の名前と ID を読み取り、従業員数のカウンターを 1 つインクリメントして、新しい従業員の情報と従業員数を表示します。

NAKAMA_Manager.cs
using UnityEngine;

public class NAKAMA_Manager : MonoBehaviour
{
    public void Start()
    {
        var employee1 = new Employee("一般人", 5);
        Employee.AddEmployee();
        Debug.Log($"NAME: {employee1.name}");
        Debug.Log($"HP: {employee1.hp}");
        Debug.Log($"Employee数: {Employee.employeeCounter}"); //Employeeクラスにアクセス

        var employee2 = new Employee("パチュリー", 30000);
        Employee.AddEmployee();
        Debug.Log($"NAME: {employee2.name}");
        Debug.Log($"HP: {employee2.hp}");
        Debug.Log($"Employee数: {Employee.employeeCounter}"); 
    }
}

public class Employee //従業員
{
    public string name; //インスタンスされる度(newされる度)に生成される変数)
    public int hp; //インスタンスされる度(newされる度)に生成される変数)

    public Employee(string name, int hp)
    {
        this.name = name;
        this.hp = hp;
    }

    public static int employeeCounter; //クラスが持つ変数
    public static int AddEmployee() 
    {
        employeeCounter++;
        return employeeCounter;
    }
}

実行結果
image.png

まとめ

・クラスのメンバーを定義する時にstaticを付けると静的宣言、静的メソッドになる
・静的メンバーは、特定のオブジェクトではなく、型自体に属する
・Unityではインスタンスを取得せずともアクセスできるようになる

参考にしたサイト

https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/static

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