提案 1: 文字列を正しく使用する
文字列
string str1 = "str1" + 9;
string str2 = "str2" + 9.ToString();
コードの最初の行では、ボックス化と文字列が生成されます。
## であり、コードの 2 行目では、内部で Number.FormatInt32
を使用する ToString() を使用しています。そのプロトタイプは
です。 NumberFormatInt32 はアンマネージ メソッドであり、その動作効率は通常の C# マネージ コードよりもはるかに高いため、コードの 2 行目の効率は 1 行目よりも高くなります。
マネージ コードとは別のブログの一節を引用します:
マネージド コードとアンマネージド コード誰もが知っているように、高レベルのコード私たちが通常のプログラミングに使用する言語は、コンピューターには認識されません。高級言語は、機械が理解して実行できるようになる前に、機械語に翻訳する必要があります。
標準 C/C では、コンパイル プロセスは次のようになります:
ソース コードは、まずプリプロセッサを通過してヘッダー ファイルとマクロを解析し、次にコンパイラを通過してアセンブリ コードを生成し、次にアセンブリを通過して機械語命令を生成し、最後にすべてのファイルを接続します。
このコンパイル方法の利点は、最終的にマシン コードが直接生成され、中間の実行環境を必要とせずにコンピュータで直接認識して実行できることですが、欠点は、異なるプラットフォームが異なるマシン コードを認識できるため、プログラムの相互互換性が失われることです。プラットフォームの機能が貧弱です。
Java言語では、ソースコードを直接機械語に変換するのではなく、中間コード(バイトコード)にコンパイルします。したがって、Java プログラムを実行するには、追加の JRE (Java Runtime Enviromental) 実行環境が必要です。JRE には JVM (Java Virtual Machine、Java 仮想マシン) が存在します。プログラムの実行時には、中間コードがさらに となります。 Explain はマシン コードであり、マシン上で実行されます。
中間コードを使用する利点は、プログラムがよりクロスプラットフォームであり、コンパイル後はさまざまなデバイスで実行できることです。
マネージド/アンマネージドは Microsoft の .net フレームワークに固有の概念であり、アンマネージド コードはネイティブ コードとも呼ばれます。 Java のメカニズムと同様に、ソース コードはまず中間コード (MSIL、Microsoft Intermediate Language) にコンパイルされ、次に .net の CLR が中間コード をマシン コードにコンパイルします。
C# と Java の違いは、Java は最初にコンパイルされてから解釈されるのに対し、C# は 2 回コンパイルされることです。
クロスプラットフォームの利点に加えて、ホスティング方法もプログラムのパフォーマンスに一定の影響を与えます。ただし、プログラムのパフォーマンスについてはこの記事の範囲を超えているため、ここでは詳しく説明しません。
さらに、.net では、C を管理拡張することもできるため、C コードも .net と CLR に依存して実行され、マネージド コードの利点が得られます。
|
简单理解就是托管代码加了一个中间层,使其可以跨平台,不过效率会降低,而非托管代码就不会产生这样的情况
所以我们编写代码秉承一个原则:尽量减少装箱拆箱
StringBuilder
StringBuilder的效率来源于预先以非托管的方式分配内存,如果没有预先定义长度,默认长度为16,不够的时候会重新分配内存,依次加16的倍数,所以如果你提前知道字符串需要的最大长度,最好预先定义好,这样就不会频繁分配内存从而带来效率的降低
2、使用默认转型方法
这个建议的大体内容是尽量使用系统所带的转换类型的方法
例如 int.Parse ToString() System.Convert 等等
3、区别对待强转类型和as is
两个类型之间转换有两种情况
1. 他们是父子类的关系: ChildType = (ChildType)ParentType
2.没有继承关系,或者继承同一个父类,这时候就需要重写强转方法
class FirstType
{
public string Name { get; set; }
}
class SecondType
{
public string Name { get; set; }
public static explicit operator SecondType(FirstType firstType)
{
SecondType secondType = new SecondType() { Name = firstType.Name };
return secondType;
}
}
FirstType firstType = new FirstType() { Name = "张" };
SecondType secondType = (SecondType)firstType;
如果是继承的关系,为了效率推荐使用 ChildType = ParentType as ChildType
这个就更上面提到的,尽量使用系统方法的转换,而不是强制转换
我写Unity的时候有这样一个需求,右键点击装备的时候会使用,装备有Equipment,Weapon,我们需要判断是Equipment还是Weapon类型,它们都是继承Item类型,有两种方法可用:
Weapon weapon = item as Weapon;
if(weapon != null)
{
//TODO 使用武器
}
if(item is Weapon)
{
weapon weapon = item as Weapon;
//TODO 使用武器
}
第一种方法只判断了一次类型,而第二种方法判断了两次类型
书上说as不能判断基元类型,但是经过我的测试发现书上写错了,as仅仅不能判断值类型,这里大家可以自己测试一下
相关文章:
C#学习记录:编写高质量代码改善整理建议4-8
C#学习记录:编写高质量代码改善整理建议9-15
以上がC# 学習記録: 高品質のコードの作成と組織の改善に関する提案 1 ~ 3の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。