cstimothy30-泛型,partial类,枚举,结构体

Windows 11 安装 Miniconda + Mamba,配置国内源 本文详细介绍了在 Windows 11 系统下安装 Miniconda 并配置 Mamba 的完整流程,包括选择精简版 Miniconda 的理由、安装过程中的关键选项设置、配置清华大学镜像源以加速包下载,以及在 base 环境中设置 pip 国内源。同时说明了 Mamba 相较 Conda 的性能优势,并指导用户完成 Mamba 安装与 Shell 集成,最终通过命令验证环境管理功能,帮助用户构建高效、轻量的 Python 开发环境。 阅读详情

030 泛型,partial类,枚举,结构体 · 语雀icon-default.png?t=M276https://www.yuque.com/yuejiangliu/dotnet/timothy-csharp-030


 

泛型在OOP编程中的地位和接口相当

泛型避免类型膨胀和成员膨胀

泛化 特化

<T>类型参数

泛型类似于cpp中的模板-vector<int>

泛型类:

//迭代1
namespace cstimothy301
{
    class Program
    {
        static void Main(string[] args)
        {
            Apple apple = new Apple() { Color = "Red" };
            Box box = new Box() { Cargo = apple };
            Console.WriteLine(box.Cargo.Color);
        }
    }
    class Apple
    {
        public string Color { get; set; }
    }
    class Box
    {
        public Apple Cargo { get; set; }
    }
}


//迭代2
//加book
//类型膨胀
namespace cstimothy302
{
    class Program
    {
        static void Main(string[] args)
        {
            Apple apple = new Apple() { Color = "Red" };
            AppleBox appleBox = new AppleBox() { Cargo = apple };
            Console.WriteLine(appleBox.Cargo.Color);
            Book book = new Book() { Name = "New Book" };
            BookBox bookBox = new BookBox() { Cargo = book };
            Console.WriteLine(bookBox.Cargo.Name);
        }
    }
    class Apple
    {
        public string Color { get; set; }
    }
    class Book
    {
        public string Name { get; set; }
    }
    class AppleBox
    {
        public Apple Cargo { get; set; }
    }
    class BookBox
    {
        public Book Cargo { get; set; }
    }
}



//迭代3
//box增加属性
//成员膨胀
namespace cstimothy303
{
    class Program
    {
        static void Main(string[] args)
        {
            Apple apple = new Apple() { Color = "Red" };
            Box box1 = new Box() { Apple = apple };
            Console.WriteLine(box1.Apple.Color);
            Book book = new Book() { Name = "New Book" };
            Box box2 = new Box() { Book = book };
            Console.WriteLine(box2.Book.Name);
        }
    }
    class Apple
    {
        public string Color { get; set; }
    }
    class Book
    {
        public string Name { get; set; }
    }
    class Box
    {
        public Apple Apple { get; set; }
        public Book Book { get; set; }
    }
}


//迭代4
//Box类中使用Object类型
//取东西时必须进行强转/as
namespace cstimothy304
{
    class Program
    {
        static void Main(string[] args)
        {
            Apple apple = new Apple() { Color = "Red" };
            Box box1 = new Box() { Cargo = apple };
            //Console.WriteLine(box1.Cargo.);//Cargo的属性是Object类型,无法访问Color,需要强转/as
            Console.WriteLine((box1.Cargo as Apple)?.Color);
            Book book = new Book() { Name = "New Book" };
            Box box2 = new Box() { Cargo = book };
            Console.WriteLine((box2.Cargo as Book)?.Name);
        }
    }
    class Apple
    {
        public string Color { get; set; }
    }
    class Book
    {
        public string Name { get; set; }
    }
    class Box
    {
        public Object Cargo { get; set; }
    }
}



//迭代5-泛型类
namespace cstimothy305
{
    class Program
    {
        static void Main(string[] args)
        {
            Apple apple = new Apple() { Color = "Red" };
            Box<Apple> box1 = new Box<Apple>() { Cargo = apple };//特化
            Console.WriteLine(box1.Cargo.Color);
            Book book = new Book() { Name = "New Book" };
            Box<Book> box2 = new Box<Book>() { Cargo = book };
            Console.WriteLine(box2.Cargo.Name);
        }
    }
    class Apple
    {
        public string Color { get; set; }
    }
    class Book
    {
        public string Name { get; set; }
    }
    class Box<TCargo>
    {
        public TCargo Cargo { get; set; }
    }
}

泛型具有正交性

泛型类型:

泛型类,泛型接口,泛型委托

泛型成员:

泛型方法,泛型属性,泛型字段

泛型接口:

 

//泛型接口
namespace cstimothy306
{
    class Program
    {
        static void Main(string[] args)
        {
            Student<int> stu1 = new Student<int>();
            stu1.ID = 101;
            stu1.Name = "Timothy";
            Teacher tech = new Teacher();
            tech.ID = 10000000001;
            tech.Name = "Tom";
        }
    }
    interface IUnique<TID>
    {
        TID ID { get; set; }
    }
    //如果1个类实现了泛型接口,这个类本身也是泛型的
    class Student<TID> : IUnique<TID>
    {
        public TID ID { get; set; }
        public string Name { get; set; }
    }
    //实现特化后的泛型接口,此时这个类就不是泛型类了
    class Teacher : IUnique<ulong>
    {
        public ulong ID { get; set; }
        public string Name { get; set; }
    }
}

泛型集合:

//C#List相当于Java中的ArrayList,cpp中的vector,动态数组;

//接口类型的变量可以引用1个引用类型的实例

//IEnumerable<T>-可迭代

//ICollection<T>-集合,可以添加和移除元素

//interface ICollection<T> : IEnumerable<T>

//泛型集合
using System.Collections.Generic;
namespace cstimothy307
{
    class Program
    {
        static void Main(string[] args)
        {
            //C#List相当于Java中的ArrayList,cpp中的vector,动态数组;
            //IList泛型接口
            //List泛型类
            //IEnumerable<T>-可迭代
            //ICollection<T>-集合,可以添加和移除元素
            //public interface ICollection<T> : IEnumerable<T>, IEnumerable
            IList<int> list = new List<int>();
            for (int i = 0; i < 10; i++)
            {
                list.Add(i);
            }
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
            //Dictionary
            //接口类型的变量可以引用1个引用类型的实例
            IDictionary<int, string> dict = new Dictionary<int, string>();
            dict[1] = "Tim";
            Console.WriteLine($"{dict[1]}");
        }
    }
}

泛型方法:

//方法膨胀比属性膨胀更严重

//方法重载-函数名相同,参数列表不同,与返回值无关

//泛型方法
//不使用泛型会造成成员膨胀
//方法膨胀比属性膨胀更严重
//方法重载-函数名相同,参数列表不同,与返回值无关
namespace cstimothy308
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] a1 = { 1, 2, 3 };
            int[] a2 = { 3, 4, 5 };
            double[] a3 = { 1.1, 2.2, 3.3 };
            double[] a4 = { 4.4, 5.5, 6.6 };
            var ret = Zip(a3, a4);//类型参数的自动推断
            Console.WriteLine(string.Join(",", ret));
        }
        static T[] Zip<T>(T[] a, T[] b)
        {
            T[] zipped = new T[a.Length + b.Length];//int[] c=new int[6];
            int ai = 0, bi = 0, zi = 0;
            do
            {
                if (ai < a.Length) zipped[zi++] = a[ai++];
                if (bi < b.Length) zipped[zi++] = b[bi++];
            } while (ai<a.Length||bi<b.Length);
            return zipped;
        }
    }
} 

泛型委托:

//泛型委托
//泛型委托+lambda+LINQ
namespace cstimothy309
{
    class Program
    {
        static void Main(string[] args)
        {
            //Action委托-无返回值的方法
            Action<string> action1 = Say;
            action1("Timothy");
            Action<int> action2 = Mul;
            action2(1);
            //Func委托-有返回值的方法
            Func<int, int, int> func1 = Add;
            Console.WriteLine(func1(100, 200));
            //泛型委托+lambda表达式
            Func<int, int, int> func2 = (x,y) => x * y;
            Console.WriteLine(func2(100, 200));
        }
        static void Say(string str)
        {
            Console.WriteLine($"{str}");
        }
        static void Mul(int x)
        {
            Console.WriteLine(x*100);
        }
        static int Add(int x, int y)
        {
            return x + y;
        }
    }
}

 

partail类

减少类的派生

partial类与EF-Entity Framework

partial类与ASP.NET Core

枚举类型

枚举类型的本质是认为限定取值范围的整数

枚举类型的比特位用法1248

按位取或|

应用场景-控制文件的打开方式

//枚举类型
namespace cstimothy309
{
    class Program
    {
        static void Main(string[] args)
        {
            Person person1 = new Person(){ Level = Level.Employee };
            Console.WriteLine((int)Level.Employee);//0
            Console.WriteLine((int)Level.BigBoss);//3
            
            //比特位用法
            person1.Skill = Skill.Cook | Skill.Program | Skill.Drive | Skill.Teach;
            Console.WriteLine(person1.Skill);//15
            Console.WriteLine((person1.Skill & Skill.Cook)>0);//True
            Console.WriteLine((person1.Skill & Skill.Cook)==Skill.Cook);//True
        }
    }
    class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public Level Level { get; set; }
        public Skill Skill { get; set; }
    }
    enum Level
    {
        Employee,//0
        Manager,//1
        Boss,//2
        BigBoss,//3
    }
    //比特位用法
    enum Skill
    {
        Drive=1,
        Cook=2,
        Program=4,
        Teach=8,
    }
}

结构体

struct为值类型

//装箱-将studnet的实例copy后,放在堆上,obj引用着在堆内存上的studnet的实例

//拆箱-将obj引用着的实例强制类型转换回来

//引用类型变量赋值的时候,变量之间copy的是对对象的引用

//值类型变量赋值的时候,变量之间copy的是1个完整的对象

结构体可以实现接口,不能派生自类/结构体

结构体不能有显式的无参构造器,但可以有显式的有参构造器

//结构体
namespace cstimothy3010
{
    class Program
    {
        static void Main(string[] args)
        {
            //student为局部变量,内存分配在栈上
            Student studnet1 = new Student() { ID = 101, Name = "Timothy" };
            //装箱-将studnet的实例copy后,放在堆上,obj引用着在堆内存上的studnet的实例
            Object obj = studnet1;
            //拆箱-将obj引用着的实例强制类型转换回来
            Student studnet2 = (Student)obj;
            Console.WriteLine($"{studnet2.ID},{studnet2.Name}");//101,Timothy
            //引用类型变量赋值的时候,变量之间copy的是对对象的引用
            //值类型变量赋值的时候,变量之间copy的是1个完整的对象
            Student stu1 = new Student() { ID = 101, Name = "Timothy" };
            Student stu2 = stu1;
            stu2.ID = 102;
            stu2.Name = "Tom";
            Console.WriteLine($"{stu1.ID},{stu1.Name}");//101,Timothy
            //显示的有参构造器
            Student stu3 = new Student(3,"Tim");
            stu3.Speak();
        }
    }
    interface ISpeak
    {
        void Speak();
    }
    struct Student:ISpeak
    {
        public int ID { get; set; }
        public string  Name { get; set; }
        public void Speak()
        {
            Console.WriteLine($"{this.ID},{this.Name}");
        }
        public Student(int id,string name)
        {
            this.ID = id;
            this.Name = name;
        }
    }
}

 

eNSP中玩转Python自动化——解锁网工新姿势(一) Python自动化一、安装Paramiko模块二、搭建实验环境1、桥接电脑网卡2、配置交换机IP地址交换机配置测试ensp的交换机与电脑的连通性:交换机配置SSHXshell验证三、Python脚本1、执行python脚本2、同步成功 一、安装Paramiko模块 首先安装Python3 然后安装pip解释器 最后安装Paramiko模块 Windows+R打开Cmd,输入命令: pip3 install paramiko 进入python,导入 paramiko模块: import paramiko 阅读详情

相关推荐

C#实现Onvif对接摄像机视频流,PTZ云台控制,预置位,VLC播放网络视频源

自己项目需要,编写此DEMO程序,亲测可用,实现主要功能如下:1、通过onvif协议获取摄像机RTSP视频流地址,并预览播放。2、通过onvif协议对摄像机进行PTZ云台控制。3、通过onvif协议设置和调用摄像机预置位功能。4、通过VLC开源播放器预览播放摄像机RTSP视频流和网络视频源,VLC版本:3.0.4.05、提供WEB API接口getcamerastreamuri,传入参摄像机ip、port、username、password可以获取此摄像机的RTSP视频流地址。

C#partial关键字的作用

主要介绍了C#partial关键字的作用详解,包括局部概念和注意点介绍,非常不错,具有参考借鉴价值,需要的的朋友参考下

C# partial关键字说明

C# 中可以将、结构或接口的定义拆分到两个或多个源文件中,在声明前添加partial关键字即可,通过本文给大家介绍C# partial关键字说明,需要的朋友参考下

C# partial的用法

C# partial的用法

qq_36907428的博客 1万+

C#笔记总结(关于刘铁锰老师的《C#入门详解》视频的笔记总结)

对于观看刘铁锰老师的《C#入门详解》视频的兄弟们或者想要获取相关C#的讲解知识,我发现了一个整理不错的链接转载来和大家分享。希望和大家一起共同进步。https://www.yuque.com/yuejiangliu/dotnet/timothy-csharp ...

xk_hypothesis的博客 3572

CSharp3新特性之六:分部方法

CSharp3新特性之六:分部方法 参考:http://blog.csdn.net/aspnet2002web/article/details/5876588 搜集整理:sagahu@163.com 日期:2012-01-04 分部是在C#2.0提供的语法特性,从C#3.0又提供了分部方法这个新语法特征。 将一个的代码分成多个同名(可以放在不同名的文件里),名前加上 part

sagahu0359的专栏 857

(五)CSharp-

程序的数据和功能被组织为逻辑上相关的数据项和函数的封装集合,并称为是一个能存储数据并执行代码的数据结构。它包含数据成员和函数成员。表-成员的数据成员存储数据函数成员执行代码字段、常量方法、属性、构造函数、析构函数 运算符、索引器、事件//显式和隐式字段初始化int F1;//初始化为 0 -string F2;//初始化为 null - 引用//初始化为 25//初始化为 “abcd”

用来学习的地方 1625

cstimoty19-委托详解

019 委托 · 语雀C#语言入门详解 委托https://www.yuque.com/yuejiangliu/dotnet/timothy-csharp-019 委托相当于cpp中的函数指针 对方法进行间接调用 委托是1个/1组方法的包装器,委托封装方法 一切皆地址 委托为C#所特有,Java对指针的舍弃相当彻底 委托 Action委托无返回值 Func委托有返回值 二者都可以有参数列表 cyy声明函数指针: typedef int(*Calc)(in..

A240428037的博客 546

CSharp语法基础

CSharp语法基础CSharp语法基础CSharp语法基础 常用工具 1.开发环境 开发环境 第一个程序 认识CS项目 2.和变量 和变量 控制台输出 3.和对象 添加 字段和方法 构造方法 的拆分 partial 4.属性 Getter和Setter 添加属性 自动属性 5.继承 继承 多态 构造方法的继承 关于ToString 6.抽象与接口 抽象 接口 内部 7.重载操作符 索引器 重载操作符 8. List Dictionary 迭代与枚举遍历 9.委.

Major_S的博客 1323

C#Csharp)学习这一篇文章就够了!!

C#——封装:在学唐老狮的课程 顺便ab自己记录一下C#是面向对象语言,也具备三大特征,ab会从这里开始。C#——封装:和声明是两个概念。相当于自定义一个变量。是从里创建出来的,而创建对象的过程称之为实例化对象。要声明在中,用来描述对象的特征,可以是任意变量(可以在一个中声明别的),同时成员变量的数量不做限制,而是否要赋值根据需求决定。成员变量的值 数字都是0,bool为false,引用为null。

qq_73410960的博客 1万+

C# 2.0 - Partial

C# 2.0 - Partial以下部分资料引用自李建忠先生的演讲稿。1. 什么是局部C# 2.0 引入了局部的概念。局部允许我们将一个、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。局部适用于以下情况:(1) 特别大,不宜放在一个文件中实现。(2) 一个中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。(3) 需

SmartJavaer的专栏 2797

partial的使用,对定制化的想法

分部和方法 - C# 编程指南 | Microsoft DocsC# 中的分部和方法拆分一个、一个结构、一个接口或一个方法的定义到两个或更多的源文件中。https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods在 C# 语言中提供了一个部分,正如字面上的意思,它用于表示一个中的一部分。 一个可以由多个部分构成,定义部分的语法形

dongnihao的博客 185

C#partial关键字(分布)

关键字用于将一个、结构或接口的定义分为多个部分,这些部分可以在同一个命名空间中的多个文件中进行编写。这种分割使得可以将一个大的实体定义分布在多个文件中,以便更好地组织和管理代码。通过分布的定义,可以将不同功能的代码逻辑分散在多个文件中,提高代码的可读性和可维护性。这对于大项目和团队合作尤其有用,因为不同开发者可以独立地工作在不同部分的文件中。需要注意的是,分布的所有部分必须具有相同的修饰符、可访问性级别和基(如果有基)。此外,分布的定义必须在同一个命名空间下。你可以像使用普通的一样使用。

ultramand的博客,重生之我在cad上二次开发猛猛敲C#代码~ 1194

C#,Partial关键字的作用

Partial types允许把,结构和接口打破为多个代码碎片存在不同的源代码文件,以便于简化开发和维护。加之partial types允许机器产生的和用户编写的部分分离,这样就可以方便增加工具产生的代码。 Partial,是一个新的修饰符,在把一个定义在多个部分的时候使用。 下面是一个例子: PartialClass1.cs ...

239

C#中的局部partial关键字:理解与应用

局部C#提供的一种强大的工具,它可以提高代码的可读性和组织性,减少合并冲突,并将自动生成的代码与用户编写的代码分开。对于需要包含许多不同功能的大程序,局部将使得结构更加清晰,同时也方便多人协作。然而,使用它时需要审慎,避免过度使用,以防止引入不必要的复杂性和混乱。

weixin_43337276的博客 930

C#——入门

C#中,无处不在,因为它可以避免成员膨胀或者膨胀,又因为其具有良好的正交性继而产生了/接口/委托/...)和成员(属性/方法/字段/...),也可以做到方法的参数推断,我们会通过例子一一了解先来看看什么是膨胀 请按照注释顺序查看代码: 再来看看什么是成员膨胀 来看看怎么用解决上面的问题 注意按照注释顺序查看: 再来看看接口如何使用 同样是按照注释顺序查看: 这个例子在声明Student的时候,我们实现了

qq_41810413的博客 888

Csharp基础整理

0. C#的几个概念 CLR(Common Language Runtime)公共语言运行库 CLS(Common Language Specifiction)公共语言规范 CTS(Common Language System)通用系统 1. C#的变量命名规则 变量的名以字母、下划线或@开头,后面可以跟字母、数字、下划线,而不能包含空格、标点符号、运算符等其它符号。 变量名不能与C#中的关键字

Bart_G的博客 4398

WPF学习——C#语言中的事件

参考:C#语言入门详解https://www.bilibili.com/video/BV1wx411K7rb?p=19刘猛铁 评论区笔记:https://www.yuque.com/yuejiangliu/dotnet/timothy-csharp-020-022 Timer 的一些成员,其中闪电符号标识的两个就是事件: 通过查看 Timer 的成员,我们不难发现一个对象最重要的三成员: 属性(小扳手):对象或当前处于什么状态 方法(小方块):它能做什...

ngany的博客 795

谈谈C#中的、变量与对象

什么是 Type 又名数据(Data Type) A data type is a homogeneous collection of values, effectively presented, equipped with a set of operations which manipulate these values. 是数据在内存中存储时的“号” 小内存容纳大尺寸数...

覃鸿宇的博客 617

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 02. Web Host 的默认配置

视频地址: https://www.bilibili.com/video/av38392956/?p=2 语雀 https://www.yuque.com/yuejiangliu/dotnet/ixtbmb ASP.NET Core MVC 02. Web Host 的默认配置 再来看下:CreateWebHostBuilder这个方法 它使用了WebHost的静态方法Creat...

weixin_30314631的博客 274

cstimothy17-字段,属性,索引器,常量

017 字段、属性、索引器、常量 · 语雀https://www.yuque.com/yuejiangliu/dotnet/timothy-csharp-017 程序=数据+算法 字段,属性,索引器,常量都是表示数据的 C#所具有的成员: 字段√ 属性√ 索引器√ 常量√ 方法 事件 构造函数 析构函数 运算符 字段-成员变量 实例字段-对象 static字段- 字段初始化的时机 无显式初始化时,字段获得其的默认值 值-..

A240428037的博客 374
上一篇: 20. 有效的括号
下一篇: 144. 二叉树的前序遍历
syc596
博客等级 码龄7年 25粉丝 344原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值