[C#]  クラス・メソッドについて

戻り値の無いメソッドでもreturnは使える
---

```C#:ClassSample.cs
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Print12Hour(5);
            Print12Hour(18);
            Print12Hour(25);
        }

        static void Print12Hour(int hour)
        {
            if (hour < 0 || 24 < hour)
            {
                Console.WriteLine("正しい値ではありません");
                return;
            }
            if (hour <= 12)
            {
                Console.WriteLine("午前{0}時です", hour);
            }
            else
            {
                Console.WriteLine("午後{0}時です", hour - 12);
            }
        }
    }
}
```
スコープ
---

```C#:ClassSample
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var array = new int[] { 5, 8, 4, 9, -3, 6 };
            var foundIndex = -1;
            
            for (var i = 0; i < array.Length; i++)
            {
                if (array[i] < 0)
                {
                    foundIndex = i;  //変数iはforループの外では見えないのでfoundIndexに代入
                    break;
                }
            }
            if (foundIndex >= 0)
            {
                Console.WriteLine($"配列最初のマイナス値は{array[foundIndex]}です");
            }
            else
            {
                Console.WriteLine("配列にマイナス値はありませんでした");
            }
        }
    }
}
```
インスタンスプロパティ,インスタンスメソッド
---

```C#:ClassSample
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var date = new DateTime(2020, 11, 7);
            var year = date.Year;
            var month = date.Month;
            var day = date.Day;
            Console.WriteLine("{0}年{1}月{2}日", year, month, date);
        }
    }
}
```

```C#:ClassSample
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var date = new DateTime(2020, 11, 7);
            var date1 = date.AddDays(1);    //１日後を求める
            var date2 = date.AddMonths(6);  //６か月後を求める
            Console.WriteLine(date1);
            Console.WriteLine(date2);
        }
    }
}
```
静的メソッド,静的プロパティ
---

```C#:ClassSample
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var isLeapYear = DateTime.IsLeapYear(2020); //IsLeapYearは静的メソッド
            if (isLeapYear)
            {
                Console.WriteLine("うるう年です");
            }
        }
    }
}
```

```C#:ClassSample
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var today = DateTime.Today; //Todayは静的プロパティ、todayはDateTime型
            Console.WriteLine($"{today.Year}年{today.Month}月{today.Day}日");
        }
    }
}
```

```C#:ClassSample
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            for (var year = 1868; year <= 2030; year++)
            {
                if (DateTime.IsLeapYear(year))  //インスタンスを生成しないでメソッドを呼び出している
                {
                    Console.WriteLine(year);
                }
            }
        }
    }
}
```

```C#:ClassSample
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var book1 = new Book { Title = "伊豆の踊子", Auther = "川端康成" };
            book1.PrintTitle();
            var book2 = new Book { Title = "走れメロス", Auther = "太宰治" };
            book2.PrintTitle();
            var book3 = new Book { Title = "銀河鉄道の夜", Auther = "宮沢賢治" };
            book3.PrintTitle();
            Book.ClearCount();
            Console.WriteLine(Book.Count);
        }
    }

    class Book
    {
        public static int Count { get; set; }   //静的プロパティ

        public static void ClearCount() //静的メソッド
        {
            Count = 0;
        }

        public string Title { get; set; }
        public string Auther { get; set; }

        public void PrintTitle()
        {
            Console.WriteLine("書籍名: {0}", Title);
            Count++;

            Console.WriteLine(Count);
        }
    }
}
```

静的クラス
---

```C#:ClassSample
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var scores = new int[] { 46, 59, 48, 93, 29, 20, 70 };
            var total = ArrayUtils.Total(scores);   //静的メソッドの呼び出し
            var average = ArrayUtils.Average(scores);   //静的メソッドの呼び出し
            Console.WriteLine($"合計:{total}, 平均:{average}");
        }
    }

    static class ArrayUtils //staticメソッドで静的クラスにする
    {
        public static int Total(int[] numbers)  //配列内の数値の合計を求める
        {
            var total = 0;
            foreach (var n in numbers)
            {
                total += n;
            }
            return total;
        }

        public static double Average(int[] numbers)
        {
            var total = Total(numbers); //上記のTotalメソッドを呼び出す
            return (int)total / numbers.Length;
        }
    }
}
```
Stringクラス
---

**部分文字を取り出す**

```C#:ClassSample
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var str = "オブジェクト指向";
            var sub1 = str.Substring(0,6);
            var sub2 = str.Substring(6, 2);
            Console.WriteLine(str);
            Console.WriteLine(sub1);
            Console.WriteLine(sub2);
        }
    }
}
```
**前後の空白文字を取り除く**
Trim()

**文字列の英字を大文字/小文字にする**
ToUpper()
ToLower()

**文字列の一部を置き換える**
RePlace("staticメソッド","静的メソッド")
↓
staticメソッドが静的メソッドの文字に置き換えられる

**指定した部分文字列が存在するかどうかを調べる**
Contain("調べたい文字列")

**文字列を指定した文字で分割する**
var items = str.Split(',') 
//カンマで分割する。itemsはstringの配列(string[])になる

Mathクラス
---
**絶対値を求める**
Math.Abs(150);
Math.Abs(-320);
Math.Abs(-5,67m);
Math.Abs(-1.414);

**どちらが大きい/小さいを求める**
var max = Math.Max(value1, value2);

var min = Math.Max(value1, value2);

**小数点以下を切り捨てる/切り上げる**
var floor = Math.Floor(n);

var ceiling = Math.Ceiling(n);

**小数点以下を四捨五入する**
var r1 = Math.Round(6.4, MidpointRounding.AwayFromZero); //四捨五入

var r2 = Math,Round(6.4); //偶数丸め

DateTime構造体
---
**現在の日時を取得する**
var now = DateTime.Now; //現在の日時を取得する
var now = DateTime.Today; //今日の日時を取得
Console.WriteLine("{0}年, now.Year");
↓
他はこれに変える
now.Month
now.Day
now.Hour
now.Minute
now.Second

**書式を指定して日付を文字列に変換する**
ToString("d");
ToString("D");  など
↓
その他
f, F, yyyy, yy, MM, M, dd, d, HH, H, hh, h, mm, m, ss, s, ddd, tt
yearやsecondなどの頭文字だと思えば覚えやすい

Fileクラス
---
**テキストファイルを作成する**

```C#:ClassSample
using System;
using System.IO;    //Fileクラスを使用する際に必要

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var lines = new string[]
            {
                "あああああああああああ",
                "いいいいいいいいいいいい",
                "うううううううううううううう",
                "ええええええええええええええええ"
            };
            File.WriteAllLines(@"C:\\temp\\ああああ.txt", lines);
        }
    }
}
```
これを実行するとtempフォルダにテキストファイルが作成される（Cドライブ直下にtempフォルダを作っておくこと）

![スクリーンショット 2021-02-26 021559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/a1ebd7b8-2cae-5b8c-6cf2-210fe0c070da.png)

読み込むときは下記コードを書く

```C#:ClassSample
using System;
using System.IO;    //Fileクラスを使用する際に必要

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var lines = File.ReadAllLines(@"C:\temp\ああああ.txt");
            foreach (var line in lines)
            {
                Console.WriteLine(line);
            }
        }
    }
}
```
配列を返すメソッド
---

```C#:ClassSample
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var nums = ArrayUtils.GetArray(5);
            var total = 0;
            foreach (var x in nums)
            {
                total += x;
            }
            Console.WriteLine($"合計: {total}");
        }

        static class ArrayUtils
        {
            public static int[] GetArray(int count)
            {
                var array = new int[count];
                for (var i = 0; i < count; i++)
                {
                    var line = Console.ReadLine();
                    array[i] = int.Parse(line);
                }
                return array;
            }
        }
    }
}
```
オブジェクトを返すメソッド
---

```C#:ClassSample
using System;

namespace ClassSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var book1 = MakeBookObject();
            var book2 = MakeBookObject();

            book1.Print();
            book2.Print();

            static Book MakeBookObject()    //Book型を返すメソッド
            {
                Console.Write("書籍名⇒");
                var title = Console.ReadLine();
                Console.Write("著者名⇒");
                var auther = Console.ReadLine();
                Console.Write("ページ数⇒");
                var pages = Console.ReadLine();
                var book = new Book
                {
                    Title = title,
                    Auther = auther,
                    Pages = int.Parse(pages),
                    Rating = 3
                };
                return book;    //Bookオブジェクトを返す
            }
        }

        class Book
        {
            public string Title { get; set; }
            public string Auther { get; set; }
            public int Pages { get; set; }
            public int Rating { get; set; }

            public void Print()
            {
                Console.WriteLine($"★{Title}");
                Console.WriteLine($"{Auther} {Pages}ページ {Rating}");
            }
        }
    }
}
```