ホームページ バックエンド開発 C#.Net チュートリアル C#基礎知識編:基礎知識(11)値型、参照型

C#基礎知識編:基礎知識(11)値型、参照型

Feb 11, 2017 pm 01:25 PM

C# はオブジェクト指向言語です。オブジェクト指向の考え方では、オブジェクトのみが存在し、すべてはクラスで記述できます。たとえば、int、bool、char、string、double、long などはすべてクラスであり、30、2.5、「test」などはすべて対応するクラスのオブジェクトです。

        static void Main(string[] args)
        {
            string istring = 30.ToString();

            string dstring = 2.5.ToString();

            string sstring = "test".ToString();

            Console.WriteLine(string.Format("{0},{1},{2}", istring, dstring, sstring));

            Console.ReadLine();
        }
ログイン後にコピー

出力:

これらは ToString() メソッドを持っているため、オブジェクトであることがわかります。
私が普段コードを書くときは、上記以外にも必ずデータ型の定義に使っています:

         static void Main(string[] args)
        {
            Int32 i = 0;

            UInt32 j = 0;

            String str = "test";

            Console.ReadLine();
        }
ログイン後にコピー

これは実際には .NET の仕組みであり、.NET というプラットフォームがあります。このプラットフォーム上の C# や VB など。したがって、.NET では、さまざまな言語にマップされる一連の型が定義されています。C# では Int32 が int です。このようなデータ型はプリミティブ型と呼ばれます。C# では、クラス オブジェクトは new を使用して生成する必要があります。クラスのこの部分は定数で直接表すことができます。プリミティブ型は、.net Framework の System 名前空間で定義されます。 C# 言語のプリミティブ型の型マッピングを見てみましょう。

anystring/system.uint32uint0〜4,294,967,295は、32ビット整数に固定されていません

表中的除了string是引用类型(后面单独解释),其它都是值类型。
下面简单介绍下引用类型和值类型。
学习C语言的时候有个堆和栈的概念。
堆区——程序员分配释放,或者程序结束有OS回收,分配方式类似于链表。
栈区——由编译器自动分配释放,存放函数的参数值,变量值等。
栈内存结构可以快速的分配内存和回收内存,但栈空间有限,过多使用会“溢出”,因此栈只分配常用的,占用空间小的数据类型;堆内存结构分配内存较慢,但是利用空间大,可以存放大型数据。
在C#中,基本上所有的数据都存储在“堆”结构中,称之为“托管堆”,受.NET垃圾回收监控。但是相对于栈堆结构中内存分配效率比较低。为了正确进行垃圾回收,每次分配的堆空间比实际所需空间稍大,小型数据使用堆是不太合适的。
可以比较看一下值类型和引用类型:
C#中提供了Struct定义值类型,直接在栈上分配内存。

 /// <summary>
    /// 使用struct定义一个值类型,
    /// 值类型的只能实现接口,不能继承类
    /// </summary>
    public struct StructPositiveNumber : ICloneable  
    {
        /// <summary>
        /// 值类型字段
        /// </summary>
        private int number;

        /// <summary>
        /// 静态只读字段,作为类的初始值
        /// </summary>
        public readonly static StructPositiveNumber InitialValue = new StructPositiveNumber();

        /// <summary>
        /// 属性
        /// </summary>
        public int Number
        {
            get
            {
                return number;
            }

            set
            {
                if (value <= 0)
                {
                    throw new Exception();
                }

                this.number = value;
            }
        }
        /// <summary>
        /// 可以定义构造器,但是和类不同,这里的默认构造器依然存在
        /// </summary>
        public StructPositiveNumber(int value)
        {
            if (value <= 0)
            {
                throw new Exception();
            }

            this.number = value;
        }

        /// <summary>
        /// 实现克隆方法,返回当前对象
        /// </summary>
        /// <returns></returns>
        public object Clone()
        {
            return new StructPositiveNumber(this.number);
        }
    }
ログイン後にコピー

调用

       static void Main(string[] args)
        {
            //声明变量,赋值
            StructPositiveNumber pNumber1 = StructPositiveNumber.InitialValue;

            pNumber1.Number = 1;

            //pNumber1赋给pNumber2
            StructPositiveNumber pNumber2 = pNumber1;

            //改变pNumber2的值
            pNumber2.Number = 2;

            //看打印结果,改变了pNumber2的值,但是不影响pNumber1
            Console.WriteLine(pNumber1.Number);//1

            Console.WriteLine(pNumber2.Number);//2

            //重新初始化pNumber2,通过构造器生成改变了初始值。
            pNumber2 = new StructPositiveNumber(3);

            Console.WriteLine(pNumber2.Number);//3

            //调用Clone将pNumber2复制给pNumber1
            pNumber1 = (StructPositiveNumber)pNumber2.Clone();

            Console.WriteLine(pNumber1.Number);//3

            //改变pNumber1的值,但是pNumber2值不改变
            pNumber1.Number = 4;

            Console.WriteLine(pNumber1.Number);//4

            Console.WriteLine(pNumber2.Number);//3

            Console.ReadLine();
        }
ログイン後にコピー

结果

再看引用类型定义的:

 public class ClassPositiveNumber : ICloneable
    {
        private int number;

        public int Number
        {
            get
            {
                return this.number;
            }

            set
            {
                if (value <= 0)
                {
                    throw new Exception();
                }

                this.number = value;
            }
        }

        //引用类型自己可以初始化为null,无需定义初始值
        //public readonly static ClassPositiveNumber InitialValue = new ClassPositiveNumber();

        public ClassPositiveNumber(int value)
        {
            if (value <= 0)
            {
                throw new Exception();
            }

            this.number = value;
        }

        public object Clone()
        {
            return new ClassPositiveNumber(this.number);
        }
    }
ログイン後にコピー

调用

      static void Main(string[] args)
        {
            ClassPositiveNumber cNumber1;//默认值为null

            cNumber1 = new ClassPositiveNumber(1);

            ClassPositiveNumber cNumber2 = cNumber1;

            cNumber2.Number = 2;

            //可以看出,两个引用引用到了相同的对象
            Console.WriteLine(cNumber1.Number);//2

            Console.WriteLine(cNumber2.Number);//2

            //重新初始化cNumber2,之前的对象已被丢弃
            cNumber2 = new ClassPositiveNumber(3);

            Console.WriteLine(cNumber2.Number);//3
            
            //复制是复制一个对象的副本,因此,是两个不同的对象
            cNumber1 = (ClassPositiveNumber)cNumber2.Clone();

            Console.WriteLine(cNumber1.Number);//3

            cNumber1.Number = 4;

            Console.WriteLine(cNumber1.Number);//4

            Console.WriteLine(cNumber2.Number);//3

            Console.ReadLine();
        }
ログイン後にコピー

结果

通过例子,可以看出值类型的特点如下:
a、使用struct声明;
b、不能继承类,但是可以实现接口(当然除object类外);
c、值类型使用值类型做为字段,但是字段无法有默认值;
c、值类型中必须有默认构造器,而且自己定义构造器后,默认的无参数的构造器依然存在。而且在构造其中只能访问类中的字段,但是不能访问属性。符号=对于值类型来说是赋值,所以赋值是值类型变量不能为空,因为值类型没有引用的概念,肯定有值。

以上就是C#基础知识整理:基础知识(11) 值类型,引用类型的内容,更多相关内容请关注PHP中文网(www.php.cn)!


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C# を使用した Active Directory C# を使用した Active Directory Sep 03, 2024 pm 03:33 PM

C# を使用した Active Directory のガイド。ここでは、Active Directory の概要と、C# での動作方法について、構文と例とともに説明します。

C# シリアル化 C# シリアル化 Sep 03, 2024 pm 03:30 PM

C# シリアル化のガイド。ここでは、C# シリアル化オブジェクトの導入、手順、作業、例についてそれぞれ説明します。

C# の乱数ジェネレーター C# の乱数ジェネレーター Sep 03, 2024 pm 03:34 PM

C# の乱数ジェネレーターのガイド。ここでは、乱数ジェネレーターの仕組み、擬似乱数の概念、安全な数値について説明します。

C# データ グリッド ビュー C# データ グリッド ビュー Sep 03, 2024 pm 03:32 PM

C# データ グリッド ビューのガイド。ここでは、SQL データベースまたは Excel ファイルからデータ グリッド ビューをロードおよびエクスポートする方法の例について説明します。

C# のパターン C# のパターン Sep 03, 2024 pm 03:33 PM

C# のパターンのガイド。ここでは、C# のパターンの概要と上位 3 種類について、その例とコード実装とともに説明します。

C# の素数 C# の素数 Sep 03, 2024 pm 03:35 PM

C# の素数ガイド。ここでは、C# における素数の導入と例を、コードの実装とともに説明します。

C# の階乗 C# の階乗 Sep 03, 2024 pm 03:34 PM

C# の Factorial のガイド。ここでは、C# での階乗の概要について、さまざまな例とコード実装とともに説明します。

マルチスレッドと非同期C#の違い マルチスレッドと非同期C#の違い Apr 03, 2025 pm 02:57 PM

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

See all articles
.NET Frameworkのプリミティブ型

C#型

値の範囲備考

System.Boolean

bool

true/ false/
System.Bytebyte0 ~255

符号なし8ビット整数

System.Sbytesbyte-128 ~ 12 7記号付き 8 -bit integer
System.Charchar0 ~ 65,535符号なし16ビット整数
System.Int16short

-32,768 ~ 32 ,7 67

署名 16 -ビット整数
System.UInt16ushort0 ~ 65,535符号なし16ビット整数
System.Int32int-2,147,483 ,648 ~ 2, 147,483,647符号付き 32 ビット整数
System .Int64long

-9,223,372,036,854,775,808 ~

9,223,372,036,854,775,807

署名付き 64 -bit integer
System .UInt64ulong

0 ~ 18,446,744,073,709,551,615

符号なし 64 ビットinteger
System.Singlefloat

±1.5 × 10-45 ~ ±3.4 × 1038

(有効数字 7 桁)

32 ビット単精度浮動小数点数
System.Double double

±5.0 × 10-324 ~ ±1.7 × 10308

(有効数字 15 ~ 16 桁)

64 ビット倍精度浮動小数点
System.Decimal 10 進数

±1.0 × 10-28 ~ ±7.9 × 1028

(有効数字 27 ~ 28)

128 ビット浮動小数点数
.String string