c#软件开发学习笔记--索引器、接口、泛型

【C#进阶】C# 索引器 🍂 Hello大家好啊,我是作家桑。本文为大家介绍 C# 中的索引器。 阅读详情

c#软件开发学习笔记

一、索引器

索引器允许一个对象可以像数组一样使用下标的方式来访问。
添加一个this[int index] 这种属性

//调用
//定义学生对象
Student stu = new Student(new string[] { "六一","高考","中考","端午"});
Console.WriteLine(stu.Name);//默认值为stu对象的第一个

stu[0] = "期末";
Console.WriteLine(stu[0]);
Console.WriteLine(stu[1]);
Console.WriteLine(stu[2]);
Console.WriteLine(stu[3]);
 stu[4] = "12"; //set访问器
Console.WriteLine(stu[4]);//走get方法
//***************************************//

//定义学生类 定义姓名属性 定义构造函数传递一个数组参数
public class Student
{
    private string[] names = new string[4];//定义字符串数组长度为4
    public string  Name { get => names[0]; } //names第一个
    public Student(string[] s)
    {
        names = s;
    }
    public string this[int index] //使用stu[0]方式访问this[int index]属性
    {
        get
        {
            return names[index];
        }
        set
        {
            if (index>=names.Length) //证明names数组长度不过 需要长度加1
            {
                //新数组的长度为原先数组的长度+1
                string[] newArr = new string[names.Length+1];
                //把原数组的元素拷贝到新数组里面
                Array.Copy(names, newArr,names.Length);
                names = newArr;
            }
            // 直接把value值赋值指定位置元素   新数组的新位置添加一个元素
            names[index] = value; 
        }
    }
}

二、接口

接口(interface):主要是定义能力契约,接口里面的成员都是未实现的,类或结构体实现这个接口的时候,必须实现接口中定义的所有的成员

1.代码示例

//接口的名称一般以I开头
//书的接口
interface IBook
{
     int Id { get; set; }
     int  Name { get; set; }
     void F1();
}

//纸张的接口
interface IPaper
{ 
    string color {  get; set; }
    void F2();
}
//类可以实现多个接口
class Book : IBook, IPaper
{
    public int Id { get ; set ; }
    public int Name { get ; set ; }
    public string color { get ; set ; }
    public void F1()
    { 
    }
    public void F2()
    {
    }
}

2.接口与抽象类

接口和抽象类的区别

  • 相同点:
    1.抽象类和接口都不能实例化
    2.都可以包含未实现的方法,由派生类去实现

  • 不同点:
    1.抽象类可以包含非抽象方法,接口不能包含抽象成员
    2.抽象类只能被继承一个 接口可以被实现多个
    3.抽象类的派生需要使用override覆写类的成员 接口派生直接覆写
    4.抽象类可以包含访问修饰符 接口不能有访问修饰符
    5.抽象类可以包含 属性 字段 方法 接口可以包含属性和方法

对比维度接口 (Interface)抽象类 (Abstract Class)
定义方式使用 interface 关键字使用 abstract class 关键字
继承特性使用 : 实现(implements)使用 : 继承(extends)
成员实现要求所有成员默认为抽象,必须在实现类中实现可以包含抽象成员(需实现)和具体成员(可继承)
构造函数支持不支持构造函数支持构造函数,可用于初始化基类状态
成员支持不支持实例字段,仅支持属性、方法支持字段、属性、方法
访问修饰符限制成员默认 public,不能使用其他修饰符成员可使用 public、protected、private、internal
多继承能力支持多接口实现不支持多类继承,仅支持单继承
静态成员不支持静态成员支持静态成员(字段、方法、属性)
设计目的定义行为契约,强调"能做什么"提供基类实现,强调"是什么"
使用场景定义跨类层次的行为规范、实现多态、解耦模块定义类层次结构的公共基类、共享代码实现

总结:接口定能力,抽象定归属;多继承用接口,共代码用抽象。|

三、泛型

泛型(Generic):广泛的类型,当我们定义一个方法时候不想对返回值或参数指定具体的类型,就可以把类型定义成泛型,当我们调用这个方法时传递进去类型

1. 运行原理

控制台程序最终会编译成一个exe程序,exe被点击的时候,会经过JIT(即时编译器)的编译,最终生成二进制代码,才能被计算机执行。泛型加入到语法以后,VS自带的编译器又做了升级,升级之后编译时遇到泛型,会做特殊的处理:生成占位符。再次经过JIT编译的时候,会把上面编译生成的占位符替换成具体的数据类型。

泛型的运行分为两个阶段:

  1. 编译阶段:VS编译器遇到泛型时生成占位符
  2. JIT编译阶段:即时编译器(Just In Time)将占位符替换为具体数据类型

2.泛型方法

class Program
{
    static void Main(string[] args)
    {
        // 调用时指定类型
        Console.WriteLine(Test<int>(10));
        Console.WriteLine(Test<string>("aa"));
        Console.WriteLine(Test<bool>(true));

        // 类型推断,可省略<>
        Console.WriteLine(Test(10));
        Console.WriteLine(Test("aa"));
    }

    // 泛型方法:返回类型和参数类型由调用时指定
    static T Test<T>(T a)
    {
        return a;
    }

    // 多泛型参数
    static void Test2<T1, T2>(T1 a, T2 b) { }

    // 泛型数组参数
    static T1 Test3<T1, T2>(T1 a, T2[] b)
    {
        return a;
    }
}

3.泛型类

泛型类在实例化的时候指定类型,类中所有泛型位置使用相同的类型。

public class Calc<T> : Ical<T>
{
    public T Add(T a, T b)
    {
        return default(T);  // 返回对应类型的默认值
    }

    public T Sub(T a, T b)
    {
        return default(T);
    }
}

// 使用
Calc<int> c1 = new Calc<int>();
Calc<string> c2 = new Calc<string>();

4.泛型接口

泛型接口在接口名后面添加 <T>,在接口实现的时候确定泛型接口的类型。

internal interface Ical<T>
{
    T Add(T a, T b);
    T Sub(T a, T b);
}

// 实现时指定具体类型
public class Calc2 : Ical<int>
{
    public int Add(int a, int b) { return a + b; }
    public int Sub(int a, int b) { return a - b; }
}

// 使用类的泛型决定接口的泛型类型
public class Calc1<T> : Ical<T>
{
    public T Add(T a, T b) { return default(T); }
    public T Sub(T a, T b) { return default(T); }
}

5.泛型约束

泛型约束通过 where 关键字添加,可以把泛型的范围缩小,使其不那么广泛。

约束语法说明
where T : structT只能是值类型
where T : classT只能是引用类型
where T : new()T必须有无参构造函数
where T : 类名T必须是该类或其派生类
where T : 接口名T必须实现该接口
class People
{
    public People() { }
    public People(string b) { }
}

class Stu : People { }

interface IPeople { }
class SS : IPeople { }

class Program
{
    // 无约束
    static void Test1<T>(T a) { }

    // 值类型约束
    static void Test2<T>(T a) where T : struct { }

    // 引用类型约束
    static void Test3<T>(T a) where T : class { }

    // 无参构造函数约束
    static void Test4<T>(T a) where T : new() { }

    // 类约束
    static void Test5<T>(T a) where T : People { }

    // 接口约束
    static void Test6<T>(T a) where T : IPeople { }
}

//使用示例
Test2(10);           // 正确:值类型
Test3("ss");         // 正确:引用类型
Test4(new People()); // 正确:有无参构造函数
Test5(new People()); // 正确:People类型
Test5(new Stu());    // 正确:People的派生类
Test6(new SS());     // 正确:实现IPeople接口
Unity学习(C#)——使用泛型索引器创建自己的集合类 namespace _620使用泛型索引器创建自己的List { // class MyList<T>: class MyList<T>where T:IComparable//为了可以比较,表示T是继承自可以比较的接口 { private T[] array; private int count;//添加元素的个数 public MyList(int size) { if 阅读详情

相关推荐

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型, API 形式 Python 调用 进行简单聊天接口测试

AGI,即通用人工智能(Artificial General Intelligence),是一种具备人类智能水平的人工智能系统。它不仅能够执行特定的任务,而且能够理解、学习和应用知识于广泛的问题解决中,具有较高的自主性和适应性。AGI的能力包括但不限于自我学习、自我改进、自我调整,并能在没有人为干预的情况下解决各种复杂问题。本节将介绍如何使用 Dify 平台调用 Ollama 部署的本地模型来创建一个聊天应用。通过 API 的方式发起聊天,可以让前端自由布置所需的聊天形式。

仙魁XAN 1万+

C#索引器、接口、泛型

本文系统梳理了C#编程中的三大核心特性:索引器、接口和泛型。索引器通过类成员封装实现类似数组的访问方式,支持多类型索引和重载;接口作为规范契约,定义强制实现的多态行为,支持多继承和显式实现;泛型通过参数化类型实现代码复用和类型安全,涵盖方法、类和接口三种形式。三者各具特色又相互补充:索引器优化对象访问,接口规范行为标准,泛型提升代码通用性,共同构成了C#强大的类型系统基础。理解这些特性的本质区别和适用场景,对开发高效、安全的C#程序至关重要。

weixin_66547608的博客 644

【论文速读】MLDT:基于开源大语言模型的复杂长时机器人任务规划多层次分解方法

—在数据驱动的人工智能技术领域,开源大语言模型(LLMs)在机器人任务规划中的应用是一个重要的里程碑。近期基于开源大语言模型的机器人任务规划方法通常利用大量的任务规划数据集来提升模型的规划能力。虽然这些方法展现出了一定的前景,但它们在处理复杂长时任务时存在困难,因为这类任务需要理解更多的上下文信息并生成更长的动作序列。本文提出多层次分解任务规划方法(MLDT)来解决这一局限性。该方法创新性地在目标级、任务级和动作级对任务进行分解,以应对复杂长时任务带来的挑战。

muyulingfengye的博客 1646

c#泛型使用详解:泛型特点、泛型继承、泛型接口、泛型委托

泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。在.NET类库中处处都可以看到泛型的身影,尤其是数组和集合中,泛型的存在也大大提高了程序员的开发效率。更重要的是,C#的泛型比C++的模板使用更加安全,并且通过避免装箱和拆箱操作来达到性能提升的目的。因此,我们很有必要掌握并善用这个强大的语言特性。 C#泛型特点: 1、如果实例

zdhlwt2008的博客 1万+

YOLOv11改进 | 注意力篇 | YOLOv11引入24年ECCV的自调制特征聚合注意力模块(SMFA),并构建C2PSA_SMFA

1.SMFA介绍1.1 摘要:基于Transformer的图像复原方法由于Transformer的自注意(self-attention,SA)特性能够更好地挖掘非局部信息,从而获得更好的高分辨率图像重建效果,因此具有重要的应用价值。然而,关键点积SA需要大量的计算资源,这限制了其在低功耗器件中的应用。此外,模拟退火机制的低通特性限制了其捕获局部细节的能力,从而导致平滑的重建结果。

tsg6698的博客 952

K230+canMV开发中常见的数据类型转换参考示例

【代码】K230+canMV开发中常见的数据类型转换参考示例。

weixin_47446386的博客 68

C#接口、索引器、泛型语法

 接口:使用interface关键字进行定义,接口里面没有实现的,只是定义或者规定了类的一些规则,继承于接口的子类必须实现规则,

weixin_71189325的博客 781

【华为OD机考真题】- 斗地主之顺子(B卷-200分)(Java版)

🔔本文收录于「最新最全华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新

**My Coding Family** 816

第一阶段C#基础-13:索引器,接口,泛型

(1)接口:没有实现的合同,契约,规则,是定义一组成员,而不对成员进行实现的引用类型,只能被类和结构体所继承,类和结构体实现接口的时候,必须实现接口中定义的所有成员。(1)泛型类:Cal3c<T> : ICalc<T>泛型接口中的泛型的类型,使用的是泛型类中定义的类型(即泛型是什么类型,接口就是什么类型)(2)接口是一种规范,不具备存储数据和定义方法的能力,类和结构体继承这个接口就要以这个接口为准,进行一一实现,具体怎么实现由类和结构体决定。(3)泛型方法在调用的时候指定类型;泛型类实例化的时候指定类型。

m0_65011747的博客 1074

地统计插值学习心得(一)

(创建地统计图层工具用于根据现有的地统计图层或者地统计模型来创建包含新要素数据集的地统计图层,也就是使用构建好的地统计模型用到新的数据集中)这表明,远离极值的区域预测不受极值的影响,并且还表明,包括极值会导致钼元素浓度高的区域周围的预测明显变高。通常,我们使用同一个数据集进行建模和预测,但是在实际插值过程中,这两步的数据可以是不同的,这就是处理极值的诀窍。如果你的数据集有无法忽略的极值时(比如这些钼元素浓度),一种常见的方法是首先显式移除极值进行建模,然后在预测中使用整个数据集(包括极值)。

JData_Engineer的博客 287

Far planner代码系列(2)

graph_decoder系列(2) 承接上文 我们接着来看decoder_node.cpp的代码部分 void GraphDecoder::Init() { /* initialize subscriber and publisher */ //graph_sub_ 订阅节点/robot_vgraph 其类型是visibility_graph_msg/Graph的消息 graph_sub_ = nh.subscribe("/robot_vgrap...

博客 1534

C#入门级——泛型、泛型类、泛型接口、泛型方法和泛型委托

C#入门级——泛型、泛型类、泛型接口、泛型方法和泛型委托

dlwlrma_516的博客 5051

YOLO-V8训练自己的数据集之标注样本

四、标注样本 4.1、标注样本概述 4.1.1、样本标注主要方法 4.1.2、标注样本概念 4.1.3、标注样本实现方式 4.1.4、常见标注样本软件 4.2、标注工具LabelImg 4.2.1、LabelImg介绍 4.2.2、LabelImg特点 4.2.3、LabelImg安装方法 4.2.4、LabelImg使用方法 4.3、标注样本实操 4.3.1、安装标注软件Labelimg 4.3.2、Labelimg界面介绍 4.3.3、LabelImg实操过程中常

qq_29633789的博客 664

图解C#高级教程(三):泛型

在使用泛型类创建变量时,可以使用关键字var,让编译器根据右边的类型自动推断变量的类型。set;set;// 让编译器推断类型103.14Hellotrue需要注意的是,为具体类分配的内存是存储在堆上的。

聚焦C++/Python编程语言、大模型应用开发 4706

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C#接口和泛型

C# 中的接口和泛型类型。接口和泛型为编写灵活、可重用的代码提供了强大的工具,同时也是 C# 语言中非常重要的特性之一。

qq_42497776的博客 1185

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C#中List泛型用法,必知必会!

文章目录一、List泛型集合二、泛型示例讲解三、List的方法和属性 一、List泛型集合 集合是OOP中的一个重要概念,C#中对集合的全面支持更是该语言的精华之一。 1、为什么要用泛型集合 若我们直接将对象放入ArrayList,操作直观。但由于集合中的项都是Object类型,因此每次使用都必须就行繁琐的类型转换。那么此时,我们就可以考虑使用泛型来解决。 2、什么是泛型 泛型是C# 2.0中的新增元素(C++中称为模板),主要用于解决一系列类似的问题。这种机制允许将类名作为参数传递给泛型类型,并生成相应的

路虽远,行则必至! 7463

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C#之使用泛型和索引器实现集合类功能

using System; namespace _02 { public class MyList<T>where T:IComparable //表示继承自可比较接口 { private T[] array; private int count=0;//表示当前添加的元素的个数 public MyList(int s...

Csoap2的博客 771

C#/.NET 泛型+索引器搭建通用字典Dictionary

C#/.NET 泛型+索引器搭建通用字典Dictionary public enum Types { X, Y, Z, W } public class DemoInfoMap&amp;lt;T&amp;gt; { private Dictionary&amp;lt;Types, T&amp;gt; demoMap = new Dictionary&amp;lt;AxisTypes, T&amp;gt;(); publi

老陈聊架构 2067

索引器与泛型和接口

 索引器与泛型class SampleCollection{    private T[] arr = new T[100];    public T this[int i]    {        get        {            return arr[i];        }        set        {            arr[i] = value;    

luqinghua的专栏 1101

C#接口(Interface)与泛型

使用interface关键字,接口声明默认是public,按照惯例接口名称应该以大写的I开头。

wangyuhua_的博客 895

C#简单笔记07:接口Interface,泛型,索引器

接口 接口是相当于一个大纲,列出方法,但不实现(只有方法名无方法内容).由类来实现接口. c#中类是单继承.接口是多实现.即1个类只能继承1个类,但可以同时实现1个以上的接口. 一旦一个类实现了接口,就必须全部实现接口中定义的成员 接口不能实例化 在接口中定义方法: 1.不能添加访问修饰符,默认都是public 2.在接口中的方法不能实现. public in...

ishenjiaming的博客 365

C# 中泛型编程之泛型类、泛型方法、泛型约束详解

类型Type现在可以表示带有特定类型的实参(或绑定类型)或未指定类型的泛型(或称未绑定类型)。委托级别的约束只在声明委托变量和实例化委托时使用,类似于在类型和方法的作用范围中实施的其他任何约束。同时子类中的泛型方法不能重复基类泛型方法的约束,这一点和泛型类中的虚方法重写是有区别的,代码如下。////错误 重写和显式接口实现方法的约束是从基方法继承的,因此不能直接指定这些约束。类型参数必须具有无参数的公共构造函数。3.在子类重复基类的约束(在使用子类泛型参数时,必须在子类级别重复在基类级别规定的任何约束)

u011555996的博客 2886

C# 索引器的理解和使用

此部分内容引用自MSDN文档 使用索引器可以用类似于数组的方式为对象建立索引。 get 取值函数返回值。 set 取值函数分配值。 this 关键字用于定义索引器。 value 关键字用于定义 set 索引器所赋的值。 索引器不必根据整数值进行索引;由你决定如何定义特定的查找机制。 索引器可被重载。 索引器可以有多个形参,例如当访问二维数组时。 我对索引器的理解就是,他是一个读写自定义类中的数据集合的接口,连接自定义类中的数据集合,并可对其进行读写操作 通过该接口简化或者丰富对自定义类中数据集合的操作方式

chinaherolts2008的博客 1024

C#泛型方法

一、泛型类型的格式 声明: public void Swap(ref T x,ref T y) //函数名后要跟表示类型用占位符T代替 { //函数体 } 使用: int x=10,y=20; Swap(ref x,ref y); //自动识别,然后用实际类型替换T 示例: class Program { public static void Swap<T>(ref T...

weixin_40786497的博客 1965

C#中的泛型

泛型:通过参数化代码来实现同一个代码上操作多种类型,利用参数化类型将类型抽象化,体现了复用性 C#中的集合类就是泛型最典型的应用 一:泛型类 定义一个类A,但是这个类中的某些字段的类型是不确定的,这些字段的类型需要在类被构造出来才确定下来 二:泛型方法 定义一个方法Methon,但是方法中的参数类型是不确定的,当调用这个方法时函数的参数类型才确定下来 ...

L的博客 2248

第6章 集合、索引器与泛型

第6章 集合、索引器与泛型6.1 集合6.1.1 集合概述6.1.2 ArrayList ArrayList 动态数组,不限制元素个数和数据类型 1. ArrayList初始化ArrayList a = new ArrayList();2. 向ArrayList中添加元素ArrayList a = new ArrayList(); Student stu = new Student("令狐冲", 2

会思考的浣熊的专栏 882
上一篇: c#软件开发学习笔记--面向对象
下一篇: c#软件开发学习笔记--委托
Z599817841
博客等级 码龄4年 12粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值