//tips
//基本情報理解及びC#
桁落ちの誤差は、値がほぼ等しい二つの数値の差を求めた時、有効桁数が減ることによって発生する誤差。
https://medium-company.com/%E6%A1%81%E8%90%BD%E3%81%A1%E3%81%A8%E3%81%AF/
UTF-8は1文字を1バイトから4バイトまでの可変長で表現しており、ASCIIと上位互換がある。
パリティとは、送られてきたデータは途中でおかしくなってないかをチェックする方法で、送り手側では送るデータ(「0」と「1」の集まり)の「1」の個数が偶数か奇数かの目印(「0」か「1」)を付けて送ってやり、受け手側ではデータ内の「1」の個数と偶数・奇数の目印が一致するか確認することでデータがおかしくなってないかチェックする。
水平垂直パリティ方式の行と列に並べられたデータでは、行列に加えられたパリティビットにより、1ビットの誤りの位置を確定する事ができる。
2変数の排他的論理和は「一方が真で他方が偽」の場合のみ真となる。その相補演算は「双方が偽」または「双方が真」となり、ベン図の領域が塗られていない部分が相補演算となると覚えておけば問題ない。
//C#振り返り
よくbool型でif(flag==true)などとしていたが、これはflag=trueなどのミスにつながるためif(flag)で記載する方が良さそう。
否定+論理演算子の組み合わせは、ド・モルガンの法則などを使いなるべく簡略化するよう心がける。
!A && !B == !(A||B)
!A || !B == !(A&&B)
これもベン図で見るとわかりやすいわかりやすい。
オブジェクトの生成はそれなりにシステムやプロトコルの処理に負荷がかかり、細かな生成・破棄は逐次メモリの領域を確保・開放していくため、ガーベジコレクションを頻発させ、アプリのパフォーマンスを劣化させる。
なので、大量に生成されるループ内のオブジェクト生成などはかなり慎重に吟味する必要があり、なるべく避けるようにする。try…catchの例外処理も同様でcatchブロックへの移動は負荷がかかるため最大限避ける。
プリプロセッサディレクティブはコンパイラーに対する命令(ディレクティブ)を表し、#regionなどの#を使用することでコンパイル部分を指定したり、コードブロックを指定する事ができる。
一般的にunicodeでは1文字を2倍とで表現するが「叱」などの一部の文字は4バイトで表現し、その場合に通常のlengthでの文字列は2文字分として換算される。
ここからはコードの内容も振り替え行っていく。
Productクラスの中にProductコンストラクタという、クラスメイト同じな特殊なメソッドを作成し、ここで商品コード、商品名、商品価格の3つの引数を持つコンストラクタを用意した。
このコンストラクタでのみプロパティを変更させたいので、set部分をprivateとしている。これでProductクラスの利用者はコンストラクタ以外でプロパティの値を変更できなくなっている。
public class Product
{
public int Code { get; private set; }
public string Name { get; private set; }
public int Price { get; private set; }
public Product(int code,string name,int price)
{
this.Code = code;
this.Name = name;
this.Price = price;
}
public int GetTax()
{
return (int)(Price * 0.08);
}
public int GetPriceIncludingTax()
{
return Price + GetTax();
}
}
このクラスを利用するためには
Product tomato = new Product(1,”トマト”,180”);
とnewを使ってインスタンスを生成する。
オブジェクトのイメージとして、変数tomatoに1111などの番地がメモリに格納され、この番地をたどると
商品番号1,商品名トマト、価格180という値が格納されている。
一方でクラスではなく構造体として描かれると、変数の中に番地ではなく、値の方がそのまま格納されることになる。
ここで以前触れたメモリ効率について思い出してみると、大きなプロジェクトで、変数a,bに同じ内容を表したい場合でも、構造体の場合は値そのものを複製する必要があるが、クラスの場合は番地名の複製だけでよく、そのオブジェクトの中身のコピー処理分が構造体での処理の負荷と言われた事が理解できる。
逆に小さいプロジェクトの場合は番地をたどる必要のない構造体の方が負荷が少なくて済む。
よく見かける継承の使い方としては、isが成り立つ関係「AはBである」の時に採用される一方で、「AはBからできている」という場合では使ってはいけない。
この継承を辿っていくとC#では全ての親がSystem.Objectクラスになる。継承元を指定しなかった場合には継承元の親クラスはObjectクラス、つまり全てのクラスはオブジェクトであると言える。
フィートをメートルに換算する処理を記載した。Console.WriteLineメソッドで利用している0.0000で小数点4桁までを表示する事ができるようにしている。
using System;
namespace DistanceConverter
{
public class Program
{
static void Main(string[]args)
{
for (int feet = 1; feet <= 10; feet++)
{
double meter = feet * 0.3048;
Console.WriteLine("{0}ft ={1:0.0000}m",feet,meter);
}
}
}
}
計算ロジック部分は独立させる事ができるので、
public class Program
{
static void Main(string[]args)
{
for (int feet = 1; feet <= 10; feet++)
{
double meter = FeetToMeter(feet);
Console.WriteLine("{0}ft ={1:0.0000}m",feet,meter);
}
}
static double FeetToMeter(int feet)
{
return feet * 0.3048;
}
}
このようにできる。