品牌网站制作报价淄博搜索引擎优化

张小明 2026/1/10 11:08:24
品牌网站制作报价,淄博搜索引擎优化,wordpress优化主题,网站备案有什么用#x1f4dd; C# 静态成员总结#x1f3af; 核心区别表格特性静态成员/方法非静态成员/方法关键字static无关键字属于谁属于类本身属于类的实例对象调用方式类名.成员名对象.成员名内存位置内存中只有一份每个对象都有独立副本何时创建类加载时#xff08;程序启动#xff…C# 静态成员总结核心区别表格特性静态成员/方法非静态成员/方法关键字static无关键字属于谁属于类本身属于类的实例对象调用方式类名.成员名对象.成员名内存位置内存中只有一份每个对象都有独立副本何时创建类加载时程序启动对象实例化时new时生命周期程序运行期间对象存在期间代码要点总结1. 访问规则csharppublic class People { public string Name; // 非静态字段 public static int Count; // 静态字段 // ✅ 非静态方法可以访问静态非静态 public void Test1() { Console.WriteLine(this.Name); // ✅ 访问非静态 Console.WriteLine(Count); // ✅ 访问静态 } // ✅ 静态方法只能访问静态 public static void Test2() { // Console.WriteLine(Name); // ❌ 错误不能访问非静态 Console.WriteLine(Count); // ✅ 只能访问静态 } }2. 使用场景对比csharp// 使用示例 People p1 new People(); p1.Name 张三; // ✅ 对象访问非静态成员 People.Count 20; // ✅ 类名访问静态成员 p1.Test1(); // ✅ 对象调用非静态方法 People.Test2(); // ✅ 类名调用静态方法游戏开发实用示例示例1玩家计数器csharppublic class 玩家 { public string 名字; // 非静态每个玩家不同 public static int 总玩家数; // 静态所有玩家共享 public 玩家(string 名称) { 名字 名称; 总玩家数; // 静态计数器统计总数 } public void 显示信息() { // 非静态方法可以访问静态成员 Console.WriteLine($玩家:{名字}总玩家数:{总玩家数}); } } // 使用 玩家 玩家1 new 玩家(张三); 玩家 玩家2 new 玩家(李四); 玩家1.显示信息(); // 输出玩家:张三总玩家数:2示例2游戏工具类csharp// 静态工具类 - 不需要实例化 public static class 游戏工具 { public static int 生成随机数(int 最小值, int 最大值) { Random rnd new Random(); return rnd.Next(最小值, 最大值); } public static float 计算伤害(float 攻击力, float 防御力) { return 攻击力 * 100 / (100 防御力); } } // 使用直接通过类名调用 int 随机伤害 游戏工具.生成随机数(10, 50); float 最终伤害 游戏工具.计算伤害(100, 30);关键记忆点1. this 关键字只在非静态方法中使用代表当前对象实例可以省略编译器自动推断csharppublic void Test() { Console.WriteLine(this.Name); // 显式使用this Console.WriteLine(Name); // 隐式使用this效果相同 }2. 静态构造器csharppublic class 配置管理器 { public static string 游戏版本; // 静态构造器类加载时自动执行一次 static 配置管理器() { 游戏版本 v1.0.0; Console.WriteLine(静态构造器执行); } }3. 实用场景总结csharp// ✅ 使用静态 // 1. 工具类方法Math.Max, Console.WriteLine // 2. 全局配置游戏设置、数据库连接字符串 // 3. 计数器、统计信息 // 4. 工厂方法 // ✅ 使用非静态 // 1. 对象特有属性玩家名字、血量 // 2. 需要操作对象状态的方法 // 3. 需要继承和多态的场景⚠️常见错误错误1静态访问非静态csharppublic static void 静态方法() { Console.WriteLine(Name); // ❌ 错误静态方法不能访问非静态字段 }错误2混淆调用方式csharpPeople p new People(); p.Count 10; // ⚠️ 不推荐虽然能编译但让人困惑 People.Count 10; // ✅ 正确明确表示操作静态成员快速判断指南问自己几个问题这个数据/方法需要每个对象独立吗是 → 用非静态否 → 考虑静态这个方法需要操作对象内部状态吗是 → 用非静态否 → 考虑静态这个方法像工具函数吗如计算、转换是 → 用静态一句话总结静态属于类一份共享非静态属于对象各自独立。静态不能直接访问非静态但非静态可以访问静态。记住这个核心规则就能正确使用静态和非静态成员了C# 常量const与只读字段readonly总结核心区别表格特性常量const只读字段readonly关键字constreadonly赋值时机编译时声明时必须赋值运行时可在声明时或构造函数中赋值内存位置编译时直接替换类似宏存储在类型的内存中类型限制只能是基本类型int, string等可以是任何类型静态性隐式静态可静态或实例性能更好编译时优化正常访问修改灵活性重新编译才能修改可在构造函数中设置不同值代码要点详解1. 基本语法对比csharpclass 游戏配置 { // ✅ 常量 - 编译时确定 public const double 默认税率 0.1; public const string 游戏名称 三角洲行动; // ✅ 只读字段 - 运行时确定 public readonly DateTime 创建时间; public readonly Liststring 武器列表; public static readonly int 服务器ID; }2. 赋值规则总结csharpclass 三角洲 { // ✅ 只读字段可以在声明时赋值 public readonly double 资产 10000; public static readonly string 昵称 伊娃诺夫斯基; // ✅ 也可以在构造函数中赋值 public 三角洲() { 资产 10000000; // ✅ 非静态只读字段可以在构造中修改 // 昵称 ss; // ❌ 静态只读字段不能在非静态构造中修改 } // ✅ 静态只读字段只能在静态构造中修改 static 三角洲() { 昵称 ss; // ✅ 可以在静态构造中修改 } public void 普通方法() { // 资产 100; // ❌ 只读字段不能在普通方法中修改 } }游戏开发实用示例示例1配置系统csharppublic class 游戏设置 { // ✅ 真正的常量 - 永远不会变 public const string 游戏引擎 Unity; public const int 最大帧率 144; // ✅ 只读配置 - 启动时确定运行时不变 public readonly string 语言设置; public readonly bool 开启音效; public static readonly DateTime 游戏启动时间; // 静态构造器初始化静态只读字段 static 游戏设置() { 游戏启动时间 DateTime.Now; } // 实例构造器初始化实例只读字段 public 游戏设置(string 语言, bool 音效) { 语言设置 语言; 开启音效 音效; } }示例2装备属性csharppublic class 装备 { // ✅ 常量所有装备共享的固定值 public const int 最大耐久度 100; public const string 装备品质_传说 Legendary; // ✅ 只读每个装备特有的属性 public readonly string 装备名称; public readonly int 基础攻击力; public readonly DateTime 获取时间; public 装备(string 名称, int 攻击力) { 装备名称 名称; 基础攻击力 攻击力; 获取时间 DateTime.Now; // 每个装备获取时间不同 } }关键规则总结1. 只读字段的修改权限csharpclass 示例 { // 实例只读字段 // ✅ 声明时赋值 // ✅ 实例构造函数中赋值 // ❌ 其他方法中赋值 // ❌ 静态方法中赋值 // 静态只读字段 // ✅ 声明时赋值 // ✅ 静态构造函数中赋值 // ❌ 实例构造函数中赋值 // ❌ 其他方法中赋值 }2. 常量与只读的编译行为csharpconst int MAX_LEVEL 100; readonly int CurrentLevel 1; // 编译后 // MAX_LEVEL 被直接替换为字面值 100 // CurrentLevel 仍然是字段访问3. 重要注意事项csharppublic class 玩家 { // ❌ 常量不能用自定义类型 // public const Liststring 技能列表 new Liststring(); // ✅ 只读字段可以用任何类型 public readonly Liststring 技能列表 new Liststring(); // 注意只读只保护引用不保护对象内容 public void 学习技能() { // 技能列表 new Liststring(); // ❌ 不能重新赋值 技能列表.Add(火球术); // ✅ 可以修改列表内容 } }使用场景选择指南✅ 使用 const 的情况csharp// 1. 数学/物理常数 public const double PI 3.1415926535; public const float 重力加速度 9.8f; // 2. 固定配置值 public const int 最大玩家数 100; public const string 默认语言 zh-CN; // 3. 枚举值的替代简单情况 public const int 状态_空闲 0; public const int 状态_战斗中 1;✅ 使用 readonly 的情况csharp// 1. 需要运行时确定的配置 public readonly string 数据库连接字符串; public readonly int 服务器端口; // 2. 对象特有但创建后不变的属性 public readonly DateTime 出生日期; public readonly string 角色ID; // 3. 复杂类型的不变引用 public readonly Dictionarystring, int 物品价格表; public readonly Color 主题颜色;⚠️常见错误与陷阱错误1混淆赋值时机csharpclass 测试 { public readonly int 数值; public 测试(int x) { // 这里可以赋值 数值 x; } public void 修改() { // 这里不能赋值 // 数值 10; // ❌ 编译错误 } }错误2静态只读字段的错误使用csharpclass 游戏 { public static readonly int 玩家数量; public 游戏() { // 玩家数量 1; // ❌ 错误静态只读不能在实例构造中赋值 } static 游戏() { 玩家数量 0; // ✅ 正确在静态构造中赋值 } }陷阱只读字段的对象内容可变csharppublic class 背包 { public readonly Liststring 物品列表 new Liststring(); public void 添加物品(string 物品) { 物品列表.Add(物品); // ✅ 可以只读的是引用不是内容 // 物品列表 new Liststring(); // ❌ 不可以不能重新赋值 } }最佳实践建议1. 明确意图csharp// 明确表达这个值永远不会变 public const double 数学常数_PI 3.14159; // 明确表达这个值对象创建后不会变 public readonly DateTime 账号创建时间; // 明确表达这个值类加载后不会变 public static readonly string 游戏版本号;2. 命名约定csharp// 常量全部大写下划线分隔 public const int MAX_PLAYER_COUNT 100; public const string DEFAULT_LANGUAGE zh-CN; // 只读字段正常Pascal命名 public readonly DateTime AccountCreateTime; public static readonly string GameVersion;3. 性能考虑csharp// 频繁访问的固定值用const编译时优化 public const int BUFFER_SIZE 1024; // 需要运行时计算的用readonly public readonly int CacheSize CalculateOptimalCacheSize();一句话总结const是编译时就固定的永恒不变readonly是运行时确定但之后不变的承诺。记住const→ 简单类型真正永恒不变编译时替换readonly→ 任何类型对象/类创建后不变运行时确定选择时问自己这个值在编译时就能确定吗能 → 考虑const不能 → 用readonlyC# 类的继承与构造函数总结继承的核心概念面向对象四大特征总结特征说明示例封装隐藏内部实现暴露必要接口属性封装字段方法封装逻辑继承子类获得父类特性避免重复代码class Student : People多态同一接口不同实现提高灵活性虚方法重写、接口实现抽象定义规范而不指定实现抽象类、接口1. 继承的基本语法csharp// 父类基类 class People { public string Name { get; set; } public int Age { get; set; } } // 子类派生类使用 : 继承 class Student : People { public int StudentId { get; set; } }2. 继承的访问权限csharpclass People { public string Name; // ✅ 公共 - 可以被继承和访问 private string Secret; // ❌ 私有 - 不能被继承 protected string Nickname; // ✅ 受保护 - 可以被继承但不能被外部对象访问 protected internal string Code; // ✅ 可以被继承可以在同一程序集访问 } class Student : People { public void Show() { Console.WriteLine(Name); // ✅ 可以访问 // Console.WriteLine(Secret); // ❌ 不能访问私有 Console.WriteLine(Nickname); // ✅ 可以访问受保护 Console.WriteLine(Code); // ✅ 可以访问 } }构造函数的执行顺序1. 默认执行顺序csharpclass People { public People() { Console.WriteLine(父类构造执行); } } class Student : People { public Student() { Console.WriteLine(子类构造执行); } } // 使用 Student s new Student(); // 输出 // 父类构造执行 // 子类构造执行2. 手动调用父类有参构造csharpclass People { public string Name; public int Age; public People() { } public People(string name, int age) { Name name; Age age; Console.WriteLine($父类有参构造: {name}, {age}); } } class Student : People { public int Score; // 调用父类有参构造 public Student(string name, int age, int score) : base(name, age) // 关键在这里 { Score score; Console.WriteLine($子类构造分数: {score}); } } // 使用 Student s new Student(张三, 18, 90); // 输出 // 父类有参构造: 张三, 18 // 子类构造分数: 90继承规则总结表特性能否被继承说明公共成员(public)✅ 可以子类和外部都可访问私有成员(private)❌ 不能仅本类可访问受保护成员(protected)✅ 可以子类可访问外部不可内部成员(internal)✅ 可以同程序集同一程序集内可访问受保护内部(protected internal)✅ 可以子类或同程序集方法✅ 可以遵循访问修饰符规则构造函数❌ 不能但会隐式/显式调用静态成员✅ 可以但属于父类不重复创建游戏开发继承示例示例1游戏角色继承体系csharp// 基类所有游戏角色的共性 public class GameCharacter { public string Name { get; set; } public int Level { get; set; } public int Health { get; set; } public GameCharacter(string name) { Name name; Level 1; Health 100; } public virtual void Attack() { Console.WriteLine(${Name}发起普通攻击); } } // 战士类 public class Warrior : GameCharacter { public int Armor { get; set; } public Warrior(string name, int armor) : base(name) // 调用父类构造 { Armor armor; } public override void Attack() { Console.WriteLine(${Name}使用剑猛砍); } public void Defend() { Console.WriteLine(${Name}举盾防御); } } // 法师类 public class Mage : GameCharacter { public int Mana { get; set; } public Mage(string name, int mana) : base(name) { Mana mana; } public override void Attack() { Console.WriteLine(${Name}释放火球术); } public void CastSpell() { Console.WriteLine(${Name}施法消耗{10}法力); Mana - 10; } }示例2多层继承csharp// 基类 public class Vehicle { public string Brand { get; set; } public Vehicle(string brand) { Brand brand; } } // 一级派生 public class Car : Vehicle { public int Doors { get; set; } public Car(string brand, int doors) : base(brand) { Doors doors; } } // 二级派生 public class SportsCar : Car { public int MaxSpeed { get; set; } public SportsCar(string brand, int doors, int maxSpeed) : base(brand, doors) // 调用直接父类构造 { MaxSpeed maxSpeed; } }⚠️重要注意事项1. 单继承限制csharp// ❌ 错误C#不支持多继承 // class MyClass : ClassA, ClassB // 编译错误 // ✅ 正确但可以实现多个接口 class MyClass : ClassA, IInterface1, IInterface2 // ✅ 正确支持多层继承 class GrandParent { } class Parent : GrandParent { } class Child : Parent { } // 包含 GrandParent 和 Parent 的成员2. 构造函数调用规则csharpclass Parent { public Parent() { } // 无参构造 public Parent(int x) { } // 有参构造 } class Child : Parent { // 如果不写 : base()编译器会自动调用父类无参构造 public Child() { } // 如果父类没有无参构造子类必须显式调用有参构造 public Child(int x) : base(x) { } }3. 继承链中的访问权限csharpclass A { protected int Value 10; } class B : A { public void Show() { Console.WriteLine(Value); // ✅ 可以访问 } } class C : B { public void Display() { Console.WriteLine(Value); // ✅ 可以访问通过B继承 } }最佳实践1. 合理的继承层次csharp// ✅ 好的设计是一个的关系 class Animal { } class Dog : Animal { } // 狗是一种动物 class Cat : Animal { } // 猫是一种动物 // ❌ 不好的设计有一个的关系 class Car { } class Engine { } // class Car : Engine { } // 错误车有引擎但不是引擎2. 使用 base 关键字csharpclass Parent { protected string message 来自父类; public virtual void Show() { Console.WriteLine(message); } } class Child : Parent { public override void Show() { base.Show(); // 调用父类方法 Console.WriteLine(添加子类功能); } }3. 构造函数的设计csharp// 推荐为基类提供无参构造便于继承 public class BaseClass { public BaseClass() { } public BaseClass(string param) { } } // 或者在派生类中显式调用基类构造 public class DerivedClass : BaseClass { public DerivedClass() : base(默认值) { } }一句话总结继承让代码复用构造函数执行顺序先父后子用: base()调用父类构造。记住继承关系是是什么is-a的关系构造函数总是从最基类开始执行访问权限决定哪些成员可以被子类使用单继承多接口是C#的设计原则
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设需要服务器么网易企业邮箱注册入口官网

洛雪音乐音源完整指南:免费获取全网音乐资源的终极方案 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 想要免费收听全网最新最全的音乐吗?洛雪音乐音源就是你的完美选择&a…

张小明 2026/1/7 1:43:24 网站建设

网站开发团队名称公众号修改wordpress

第三方FTDI应用模块与自定义流驱动开发 1. 第三方FTDI应用模块概述 FTDI第三方模块可扩展系统功能,只需将模块插入系统的USB主机端口,并安装FTDI驱动,即可通过编程访问模块功能。以下是一些代表性模块: | 图编号 | 模块 | 描述 | 来源 | | — | — | — | — | | 44 - …

张小明 2025/12/27 3:19:47 网站建设

重庆职业能力建设投稿网站郑州seo关键词推广

在 Flink 中排查反压(Backpressure)问题时,火焰图(Flame Graph)是定位性能瓶颈的有效工具。以下是详细步骤:1. 确认反压存在通过 Flink Web UI 或指标系统检查反压指标:outputBufferUsage 接近 …

张小明 2026/1/6 23:45:15 网站建设

网站开发的后期维护为什么要进行网店装修

在企业数字化转型推进过程中,Java遗留系统的现代化改造始终是技术团队面临的核心挑战。传统重构实施阶段,开发人员需直面代码结构繁杂、技术文档缺失、技术债务累积等多重阻碍,这些因素直接导致项目风险攀升与开发成本增加。一、遗留系统重构…

张小明 2026/1/10 6:23:47 网站建设

西地那非片的功能主治说明书网站内容seo

还在为原神中重复的采集、钓鱼、剧情对话感到疲惫吗?BetterGI作为一款专业的原神AI自动化助手,通过智能视觉识别和自动化操作技术,让玩家从繁琐任务中解放出来,专注于真正的游戏乐趣。本指南将分享5个实用技巧,帮助你快…

张小明 2025/12/27 5:33:26 网站建设

宿迁交通工程建设有限公司网站制作公司网页什么价位

TLS与SSL协议深度解析:网络安全通信的基石 一、SSL/TLS协议概述 SSL 与 TLS 之间有何区别? 安全套接字层(SSL)是一种通信协议或一组规则,用于在网络上的两个设备或应用程序之间创建安全连接。在通过互联网共享凭证或…

张小明 2025/12/27 5:33:26 网站建设