首页 > 编程语言 >C#学习 [类型系统] 基本类型介绍(10)

C#学习 [类型系统] 基本类型介绍(10)

时间:2024-10-30 09:59:51浏览次数:1  
标签:10 变量 C# double int 类型 MyClass public

在变量中指定类型

  1. 声明变量但不初始化
int i;
MyClass m;
  1. 声明且初始化
int i=0;
MyClass m=new MyClass();
  1. 方法中参数与返回值指定类型
public int getValue(int i){
    return i;
}

内置变量

C# 提供了一组标准的内置类型,这些类型可供在任何 C# 程序中使用。

  1. 基本变量
    img
  2. 引用变量
    img

在上表中,左侧列中的每个 C# 类型关键字(dynamic 除外)都是相应 .NET 类型的别名。 它们是可互换的。 例如,以下声明声明了相同类型的变量:

int a = 123;
System.Int32 b = 123;

自定义类型

可以使用 struct、class、interface、enum 和 record 构造来创建自己的自定义类型。

public class MyClass
{
    public static void Hello()
    {
        Console.WriteLine("hello from MyClass");
    }
}

通用类型系统

img

  • 类是引用类型。
  • 结构是值类型。
  • 记录类型可以是引用类型 (record class) 或值类型 (record struct)。

值类型

值类型派生自System.ValueType(派生自 System.Object)。 派生自 System.ValueType 的类型在 CLR 中具有特殊行为。 值类型变量直接包含其值。 结构的内存在声明变量的任何上下文中进行内联分配。 对于值类型变量,没有单独的堆分配或垃圾回收开销。 可以声明属于值类型的 record struct 类型,并包括记录的合成成员

值类型分为两类:struct和enum。

内置的数值类型是结构,它们具有可访问的字段和方法:

// constant field on type byte.
byte b = byte.MaxValue;
byte num = 0xA;
int i = 5;
char c = 'Z';
  1. struct
public struct Coords
{
    public Coords(double x, double y)
    {
        X = x;
        Y = y;
    }

    public double X { get; }
    public double Y { get; }

    public override string ToString() => $"({X}, {Y})";
}

可以使用 readonly 修饰符来声明结构类型为不可变。 readonly 结构的所有数据成员都必须是只读的,如下所示:
任何字段声明都必须具有 readonly 修饰符
任何属性(包括自动实现的属性)都必须是只读的,或者是 init 只读的。 请注意,仅限 init 的资源库从 C# 版本 9 开始可用。

public readonly struct Coords
{
    public Coords(double x, double y)
    {
        X = x;
        Y = y;
    }

    public double X { get; init; }
    public double Y { get; init; }

    public override string ToString() => $"({X}, {Y})";
}
public readonly double Sum()
{
    return X + Y;
}
public readonly override string ToString() => $"({X}, {Y})";
private int counter;
public int Counter
{
    readonly get => counter;
    set => counter = value;
}
public readonly double X { get; init; }
  1. enum

枚举定义的是一组已命名的整型常量。

public enum FileMode
{
    CreateNew = 1,
    Create = 2,
    Open = 3,
    OpenOrCreate = 4,
    Truncate = 5,
    Append = 6,
}

引用类型

定义为 class、record、delegate、数组或 interface 的类型是 reference type,引用类型完全支持继承。

在声明变量 reference type 时,它将包含值 null,直到你将其分配给该类型的实例,或者使用 new 运算符创建一个。

MyClass myClass = new MyClass();
MyClass myClass2 = myClass;
MyClass myClass = new MyClass();

// Declare and assign using an existing value.
IMyInterface myInterface = myClass;

// Or create and assign a value in a single statement.
IMyInterface myInterface2 = new MyClass();

创建对象时,会在托管堆上分配内存。 变量只保留对对象位置的引用。

所有数组都是引用类型,即使元素是值类型,也不例外

// Declare and initialize an array of integers.
int[] nums = { 1, 2, 3, 4, 5 };

// Access an instance property of System.Array.
int len = nums.Length;

文本值的类型

文本值从编译器接收类型。

string s = "The answer is " + 5.ToString();
// Outputs: "The answer is 5"
Console.WriteLine(s);

Type type = 12345.GetType();
// Outputs: "System.Int32"
Console.WriteLine(type);

泛型类型

可使用一个或多个类型参数声明的类型,用作实际类型(具体类型)的占位符 。

List<string> stringList = new List<string>();
stringList.Add("String example");
// 下面代码会造成编译错误:
stringList.Add(4);

通过使用类型参数,可重新使用相同类以保存任意类型的元素,且无需将每个元素转换为对象。

泛型集合类称为强类型集合。

隐式类型本地变量

可声明局部变量而无需提供显式类型。 var 关键字指示编译器通过初始化语句右侧的表达式推断变量的类型。

// i is compiled as an int
var i = 5;

// s is compiled as a string
var s = "Hello";

// a is compiled as int[]
var a = new[] { 0, 1, 2 };

// expr is compiled as IEnumerable<Customer>
// or perhaps IQueryable<Customer>
var expr =
    from c in customers
    where c.City == "London"
    select c;

// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };

// list is compiled as List<int>
var list = new List<int>();

**带 var 关键字的隐式类型只能应用于本地方法范围内的变量。 隐式类型不可用于类字段。

指针类型(Pointer types)

指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。

char* cptr;
int* iptr;

标签:10,变量,C#,double,int,类型,MyClass,public
From: https://www.cnblogs.com/huiy/p/18510540

相关文章

  • C#学习 [类型系统] 泛型(16)
    使用场景在编译时可以不指定具体类型,在具体使用时指定,从而代码具有较高的通用性。示例代码定义publicclassGenericTest<T>{T[]array;publicGenericTest(intsize){array=newT[size];}publicTget(intindex){re......
  • 2个月搞定计算机二级C语言——真题(6)解析
    1.前言本篇我们讲解2个月搞定计算机二级C语言——真题62.程序填空题2.1题目要求2.2提供的代码#include<stdio.h>unsignedlongfun(unsignedlongn){unsignedlongx=0;intt;while(n){t=n%10;/**********fou......
  • 【2024-10-29】提还房贷
    20:00如果一个人认为自己幸福,他就足够幸福了。                                                 ——德·拉·费耶特夫人何太前段时间讨论起了提前还房货这事。一下子......
  • 科普文:软件架构网络系列之【信创:SAN 交换机“卡脖子”,RoCE V2 成破局关键】
    概叙目前,不少企业数据中心使用FC交换机和集中式SAN存储(以下简称“FC-SAN架构”),支持核心业务系统、数据库、AI/ML等高性能业务场景。科普文:软件架构Linux系列之【非信创方案VMAX250F:城商行核心存储系统升级改造和统一存储监控实现实践分享】李军华-CSDN博客而在开展IT......
  • C10-09-XSS之获取键盘记录、盲打获取cookie及克隆网站和文件上传绕过练习
    免责声明本文仅是个人对XSS和文件上传绕过及相关工具的学习测试过程记录,不具有恶意引导意向。一使用pikachu平台练习XSS键盘记录以dvwa-Low靶场为目标网站,通过dvwa的存储型XSS上传JS,验证pikachu工具对dvwa靶场页面键盘操作的记录1.1调试pikachu环境①调整Pikac......
  • 【Canvas与图标】牛皮纸文件袋图标
    【成图】120*120的png图标:以下是大小图:【代码】<!DOCTYPEhtml><htmllang="utf-8"><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><head><title>文件袋图标</title><styletype=&q......
  • 从 GC 到 WeakMap、WeakSet
    一、内存泄漏1.1简介内存泄漏:指计算机科学中的一种资源泄漏,主要是因为计算机程序内存管理疏忽或错误造成程序未能释放已经不再使用的内存,因而失去对一段已分配内存空间的控制,程序将继续占用已不再使用的内存空间,或是存储器所存储的对象,无法通过执......
  • 设计卷积神经网络CNN为什么不是编程?
    上一篇:《搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)》序言:现在让我们开始走进卷积神经网络(CNN)的世界里。和传统编程完全不同,在人工智能的程序代码里,您看不到明确的算法规则,看到的只是神经网络的配置说明。这里的代码不会像传统编程那样去具体实现每个功能......
  • rce漏洞分析
    前几日在浏览github项目时,发现之前审计过的一个cms更新了,从日志中看到修复了一个安全漏洞,并且源码是开源的,所以根据版本对比找到修补的地方,进而发现一个命令执行的漏洞前几日在浏览github项目时,发现之前审计过的一个cms更新了,从日志中看到修复了一个安全漏洞,并且源码是开源......
  • System.Data.SqlClient老版本引发内存溢出的问题
    有一个朋友和我说他负责的项目有内存溢出的情况,内存一直居高不下达到了8G。生产环境碰到内存溢出的情况我还没有碰到过,这次有机会实践一下,准备试试,拿到了dump文件,压缩包300M,解压出来3G。该事件是发生在2023年,写这篇文件的是已经是2024年了,为什么会间隔这么久才写这篇文章,因为当时......