吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1438|回复: 4
收起左侧

[学习记录] C# 学习笔记 泛型结构体和类索引器

  [复制链接]
Cool_Breeze 发表于 2021-3-1 10:40
本帖最后由 Cool_Breeze 于 2021-3-18 14:50 编辑

[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;

class Test
{
    // 泛型结构体
    struct nameList<type>
    {
        // type 类型需要外部调用者给出
        public type a;
    }
    
    // 一般结构体
    struct nameValue
    {
        public int a;
        
        // 强制转换类型 
        // implicit 隐式转换
        public static explicit operator nameList<nameValue>(nameValue x){
            // 说白了就像是在 nameList<nameValue> 构造器里面 创建一个
            // nameList<nameValue> 实例,然后返回这个实例
            
            // 创建一个 nameList<nameValue> 类型 v
            // 将 nameValue x 类型的成员a(int)赋给v里面的类型nameValue的成员a
            nameList<nameValue> v = new nameList<nameValue>();
            
            // v 等于 nameList<nameValue>
            // a 等于 nameList<nameValue>.a
            // a 等于 nameValue.a
            v.a.a = x.a;
            // 然后返回类型 nameList<nameValue> 完成转换
            return v;
        }
    }
    
    static void Main(){
        
        nameList<int[]> a;
        // 分配内存空间
        a.a = new int[]{1,2,3,4,};
        
        
        // a存放的数组类型(引用类型) 将会修改同一个内存地址区域
        foreach (var n in a.a){
            Console.WriteLine(n); // 1 2 3 4
        }

        nameList<int[]> b;
        b.a = a.a;
        // 改变b.a 的值
        for (int i=10, index=0; i>6; i--, index++){
            b.a[index] = i;
            Console.WriteLine(i); // 10 9 8 7
        }
        // a.a的值改变
        foreach (var n in a.a){
            Console.WriteLine(n); // 10 9 8 7
        }
        
        // v 类型为nameValue
        nameList<nameValue> v;
        
        // 创建一个 nameValue 值 x
        nameValue x;
        x.a = 100;
        
        // v.a存放的一般结构体 (值类型)
        // 强制转换类型方法已经写明
        // 将x 显示转换为v类型 v是x一份副本
        v = (nameList<nameValue>)x;
        Console.WriteLine(v.a.a); // 100
        
        // vr 
        nameList<nameValue> vr;
        vr = v;
        // 赋值后更改v.a.a的值, vr.a.a的值不变
        v.a.a = 200;
        Console.WriteLine(vr.a.a); // 100
        
        
        CSharpVidoe book = new CSharpVidoe();
        book["C#"] = "刘铁锰C#入门详解";
        Console.WriteLine(book["C#"]);
        Console.WriteLine(book["C"]);
    }
    
    // 索引
    class CSharpVidoe
    {
        // 创建一个字典key为string 值为int
        Dictionary<string, string> bookDict = new Dictionary<string, string>();
        
        // 索引属性
        // 引入的索引器的元素类型 string 类型数据,参数为key
        public string this[string name]
        {
            get
            {
                // 检查字典里面的key是否包涵具有 输入的key
                if (this.bookDict.ContainsKey(name))
                {
                    // 存在直接返回
                    return bookDict[name];
                }
                else
                {
                    // C#  编译器将 null  字符串视为空字符串进行处理
                    // 不存在返回一个空值
                    return null;
                }
                
            }
            // 这里的 value 是在set上下文中是关键字
            // 代表接收的输入值
            set
            {
                if (this.bookDict.ContainsKey(name))
                {
                    // 具有,更新值
                    // value 是 string 类型
                    this.bookDict[name] = value;
                }
                else
                {
                    // 没有,加入值
                    this.bookDict.Add(name, value);
                }
            }
        }
    }
}


[C#] 纯文本查看 复制代码
using System;

class Program
{
    static void Main()
    {
        IndexExerise test = new IndexExerise();
        test[1] = "123";
        test[2] = "123";
        test[3] = "123";
        
        for (sbyte i=0; i<IndexExerise.Size; i++)
            Console.WriteLine(test[i]); // 整数索引
        Console.WriteLine(test["12"]); // 字符串索引
    }
    
    class IndexExerise
    {
        static public sbyte Size = 10;
        private string[] array = new string[Size];
        
        public IndexExerise()
        {
            for (sbyte i=0; i<IndexExerise.Size; i++)
            {
                array[i] = "N/A";
            }
        }
        
        // 下标索引方法实现,使用的方括号  this [ int n ] 
        public string this[int n] // 整数索引
        {
            get
            {
                string temp;
                if (n >=0 && n < IndexExerise.Size) // 检查是否越界
                    temp = array[n];
                else
                    temp = "None";
                return temp;
            }
            set
            {
                if (n >=0 && n < IndexExerise.Size)
                    array[n] = value;
            }
        }
        
        // 重载索引器
        public int this[string key] // 字符串索引
        {
            get
            {
                int res = -1;
                for (sbyte i=0; i<IndexExerise.Size; i++)
                {
                    if (array[i] == key) // 检查数组里面是否包含此字符串
                    {
                        res = i;
                        break;
                    }
                }
                return res;
            }
        }
    }
}

免费评分

参与人数 3吾爱币 +3 热心值 +3 收起 理由
caxzan + 1 + 1 我很赞同!
明月相照 + 1 + 1 谢谢@Thanks!
aa2yy + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

whngomj 发表于 2021-3-1 10:49
谢谢分享,学习了。
田田爱崽崽 发表于 2021-3-1 10:55
LIANG1111 发表于 2021-3-1 11:21
明月相照 发表于 2021-3-1 12:27
学习下,谢谢分享。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-16 21:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表