C#-二十五问总结

经典的25到C#问题 你必须知道的C#的25个基础概念(附演示) 先自己复习一下,看看下面的C#问题都能回答上来么? 立即下载
/***********************************************
 * 静态变量
 *        在所属类装载时被创建;
 *        通过类(注意,是类,不是类的对象)进行访问;
 *        自始自终只存在一个值.
**********************************************
*/

namespace 重要小知识点 //静态变量
{
    
class Program
    
{
        
static int staNum = 0; //静态成员
        public int pubNum = 10; //类成员
        static void Main(string[] args)
        
{
            Program p 
= new Program();
            p.pubNum 
= 100; //使用对象 访问类成员
            Program.staNum = 999;  //使用类名 访问静态成员
        }

    }

}





/***********************************************
 * const 和 static readonly
 * const 是在编译期间初始化
 * static readonly 是在运行期间初始化
 * 实验见 "C#基础概念二十五问"
**********************************************
*/

namespace 重要小知识点 //const 和 static readonly
{
    
class Program
    
{
        
public const int conNum = 100;
        
public static readonly int srNum = 10000;

        
static void Main(string[] args)
        
{
            Console.WriteLine(Program.conNum);    
//调用方法一样
            Console.WriteLine(Program.srNum);    //调用方法一样    
        }

    }

}




/***********************************************
 * abstract
 *        此修饰可以用于类、方法、属性、事件和索引指示器.
 * 下面一段程序中需要注意的
 *        抽象类中定义了一个Attribute,但它并不需要知道这是谁的属性;
 *        事件的定义方法,事件的响应函数,怎样触发一个事件;
 *        索引,可以对"对象"进行索引,也可以针对"成员"进行索引.
**********************************************
*/

namespace 重要小知识点 //abstract
{
    
class Program
    
{
        
public abstract class AMedia //抽象类
        {
            
public abstract string Attribute //属性
            {
                
get;
                
set;
            }

            
public abstract event EventHandler Play; //事件 注意写法
            public abstract void Response();
            
public abstract string this[int Index] //索引 注意写法
            {
                
get;
            }

        }

        
public class Mp3 : AMedia
        
{
            
//注意父抽象类,里面虽然有 Attribute属性,但却不需要定义 attribute变量
            private string attribute;
            
public override string Attribute //属性
            {
                
get
                
{
                    
return attribute;
                }

                
set
                
{
                    attribute 
= value;
                }

            }

            
public override event EventHandler Play; //事件
            public override void Response()
            
{
                
if (Play != null)
                
{
                    Play(
this, new EventArgs());
                }

            }

            
public override string this[int Index] //索引
            {
                
get
                
{
                    
switch (Index)
                    
{
                        
case 1:
                            
return "one";
                        
case 2:
                            
return "two";
                        
case 3:
                            
return "three";
                        
default:
                            
return "rand";
                    }

                }

            }

        }

        
static void OnPlay(object sender, EventArgs e)
        
{
            Console.WriteLine(
" Mp3 is playing...");
        }

        
static void Main(string[] args)
        
{
            Mp3 mp3 
= new Mp3();
            mp3.Attribute 
= " HelloWorld!"; //使用属性
            Console.WriteLine(mp3.Attribute);

            mp3.Play 
+= new EventHandler(OnPlay); //与响应函数关联
            mp3.Response();//触发事件

            
int i = 0;
            
for (i = 0; i < 4; i++)
            
{
                Console.WriteLine(mp3[i]); 
//索引(针对 对象)
            }

            
for (i = 0; i < mp3.Attribute.Length; i++)
            
{
                Console.WriteLine(mp3.Attribute[i]); 
//索引(针对 属性)
            }

        }

    }

}





/***********************************************
 * sealed 密封
 *    1)    用于类时,该类不能再被继承;(不能和abstract同用)
 *    2)    用于方法和属性时,该方法和属性不能被继承,必须和override
 *        连用,使用sealed修饰的方法肯定是基类中的    虚成员.
**********************************************
*/

namespace 重要小知识点 //sealed
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            A a 
= new A();
            a.ShowMe();
            B b 
= new B();
            b.ShowMe();
        }

    }

    
sealed class SealSelf //此类无法再被继承
    { }

    
class A
    
{
        
public virtual void ShowMe()
        
{
            Console.WriteLine(
"I am A.");
        }

    }

    
class B : A
    
{
        
//密封的肯定是基类中的虚成员
        public sealed override void ShowMe() //密封
        {
            Console.WriteLine(
"I am B.");
        }

    }

    
class C : B
    
{
    }

}




/***********************************************
 * 索引指示器
 *        可以像数组那样使用其实例后的对象,但与数组不同的是
 * 索引指示器的参数类型不仅限于int.
**********************************************
*/

namespace 重要小知识点
{
    
class Program
    
{
        
private string secret;
        
static void Main(string[] args)
        
{
            Program pro 
= new Program();
            pro.Secret 
= "ILOVEU";
            
for (int i = 0; i < pro.Secret.Length; i++) //对类成员的索引操作
            {
                Console.WriteLine(pro.Secret[i]);
            }

        }

        
public string this[int Index] //不仅限于int,可以是string Index等等
        {
            
get
            
{
                
return secret;
            }

        }

        
public string Secret
        
{
            
get
            
{
                
return secret;
            }

            
set
            
{
                secret 
= value;
            }

        }

    }

}



/***********************************************
 * this
 * 关注该程序是如何测试效率的!
 * Environment.TickCount
**********************************************
*/

namespace 重要小知识点
{
    
class Program
    
{
        
private string value;
        
static void Main(string[] args)
        
{
            Program pro 
= new Program();
            Console.WriteLine(pro.Test1());
            Console.WriteLine(pro.Test2());
        }

        
public string Test1()
        
{
            
long vTickCnt = Environment.TickCount;
            
for (int i = 0; i < 10000000; i++)
            
{
                
this.value = i.ToString(); //使用this调用成员
            }

            
return string.Format("Have this.:: {0} MSEL", Environment.TickCount - vTickCnt);
        }

        
public string Test2()
        
{
            
long vTickCnt = Environment.TickCount;
            
for (int i = 0; i < 10000000; i++)
            
{
                value 
= i.ToString(); //不使用this调用成员
            }

            
return string.Format("Have this.:: {0} MSEL", Environment.TickCount - vTickCnt);
        }

    }

}



/***********************************************
 * 可以使用抽象函数重写基类中的虚函数吗?
 * 答:可以.   需要使用 new 修饰符显式声明.
 * new:隐藏了基类中该函数的实现.
 * override:重新了基类中的函数.
**********************************************
*/

namespace 重要小知识点
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
        }

    }

    
class Base
    
{
        
public virtual void Show()
        
{
            Console.WriteLine(
"I am Base...");
        }

    }

    
abstract class Son : Base
    
{
        
public new abstract void Show();
    }

}



/***********************************************
 * 密封类可以有虚函数吗?
 * 答:可以.   但基类中的虚函数隐式转换成非虚函数.
**********************************************
*/

namespace 重要小知识点
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
        }

    }

    
class Base
    
{
        
public virtual void Show()
        
{
            Console.WriteLine(
"I am Base...");
        }

    }

    
sealed class Son : Base
    
{
        
// Base中的虚函数Show()已隐式转换为非虚函数了.
        
//Son类不能自己再定义虚函数!
    }

}




/***********************************************
 * 类和结构的区别
 *       类是引用类型,在堆上分配,类的实例进行赋值其实只是复
 * 制了引用;
 *       结构是值类型,在栈上分配,结构的赋值操作将产生一个新
 * 对象.
 * 
 * 堆和栈
 *     堆:需要手动释放. 如类,如new
 *     栈:系统自动释放. 如函数里的变量
**********************************************
*/

namespace 重要小知识点
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            OwnClass oc 
= new OwnClass("Hello");
            OwnStruct os 
= new OwnStruct("Hello");
        }

    }

    
class OwnClass
    
{
        
private string secret;
        
public OwnClass(string str)
        
{
            
//注意,这里的赋值操作. str 是一个引用类型,
            
//所以不要再分配内存空间.
            this.secret = str;
        }

    }

    
struct OwnStruct
    
{
        
private string secret;
        
//结构也可以有构造函数,但必须是有参数的构造函数.
        public OwnStruct(string str)
        
{
            
//注意,这里的赋值操作. str 并非是一个引用类型,
            
//所以得为它再分配内存空间.
            this.secret = str;
        }

    }

}




/***********************************************
 * 接口的多继承会带来哪些问题?
 * 答:如果两个或多个父接口中存在同名成员,就产生二义性.
 *     此时,最好使用显式声明.
**********************************************
*/

namespace 重要小知识点
{
    
class Program : Video, Audio
    
{
        
void Video.Play() //显式声明
        {
            Console.WriteLine(
"Video is working...");
        }

        
void Audio.Play() //显式声明
        {
            Console.WriteLine(
"Audio is working...");
        }

        
static void Main(string[] args)
        
{
            Program pro 
= new Program();
            
//注意如何调用
            Video v = (Video)pro; //显示转换
            v.Play();
            Audio a 
= (Audio)pro; //显示转换
            a.Play();
        }

    }

    
interface Video
    
{
        
void Play();
    }

    
interface Audio
    
{
        
void Play();
    }

}




/***********************************************
 * 抽象类和接口的区别:
 *     抽象类可以包含 定义 和 实现;
 *     接口只可以包含 定义.
 * 
 *        抽象类是从一系列对象中抽象出来的概念,因此反映事物
 * 的内部共性;
 *        接口是为了满足外部调用而定义的一个功能约定,因此反
 * 映的是事物的外部特性.
 * 
 *        分析对象,提炼内部共性形成抽象类,用以表示对象本质,
 * 即"是什么";
 *        为外部提供调用或功能需要扩充时优先使用接口.
**********************************************
*/

namespace 重要小知识点
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
        }

    }

    
abstract class Base
    
{
        
public abstract void Show();
        
public void Hide() //抽象类可以有已实现的成员
        {
            Console.WriteLine(
"have hided...");
        }

    }

    
class Son : Base
    
{
        
public override void Show()
        
{
            Console.WriteLine(
"I am Base's son...");
        }

    }

}



/***********************************************
 * using 别名指示符
 *     包含其它文件,为某个类型起个别名;
 *     只在一个单元文件内起作用.
**********************************************
*/

namespace 重要小知识点
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            T1.Test1 t1 
= new T1.Test1(); //T1 是 Test1.cs 的别名
            t1.Show();
            T2.Test2 t2 
= new T2.Test2();
            t2.Show();
        }

    }

}




/***********************************************
 * StringBuilder和String的区别
 * String虽然是引用类型,但在赋值时却会产生新的对象;
 * StringBuilder则不会,所以在处理大量字符串时,它是首选.
**********************************************
*/

namespace 重要小知识点
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            Program pro 
= new Program();
            pro.Test1();
            pro.Test2();
        }

        
public void Test1()
        
{
            
long vTickCnt = Environment.TickCount;
            
string str = null;
            
for (int i = 0; i < 20000; i++)
            
{
                str 
+= i.ToString();
            }

            Console.WriteLine(
"string 字符串相加需要 {0} 毫秒", Environment.TickCount - vTickCnt);
        }

        
public void Test2()
        
{
            
long vTickCnt = Environment.TickCount;
            StringBuilder sb 
= new StringBuilder();
            
for (int i = 0; i < 20000; i++)
            
{
                sb.Append(i);
            }

            Console.WriteLine(
"StringBuilder 字符串相加需要 {0} 毫秒", Environment.TickCount - vTickCnt);
        }

    }

}





/***********************************************
 * params
 *        该关键字用在方法的参数列表中,为该方法参数提供了可
 * 变的能力.它只能出现一次,且只能定义在所有参数最后.
**********************************************
*/

namespace 重要小知识点
{
    
class Program
    
{
        
//params 定义的参数后面不可以再定义其它参数
        public static void UseParams(string str, params object[] list)
        
{
            Console.WriteLine(str);
            
for (int i = 0; i < list.Length; i++)
            
{
                Console.WriteLine(list[i]);
            }

        }

        
static void Main(string[] args)
        
{
            String[] str 
= new string[] { "I", "LOVE", "YOU" };
            Program.UseParams(
"Hello", str);
        }

    }

}
 
目标检测数据集 第069期-基于yolo标注格式的玻璃清洁状态检测数据集(含免费分享) 但这类技术的落地,离不开大量标注规范、场景丰富的数据集作为算法训练的支撑,玻璃清洁状态检测数据集的出现,正是为了满足这一市场与技术需求。在高校与科研机构的计算机视觉研究中,该数据集可作为基础研究素材,用于探索物体状态识别的算法优化方向,比如针对玻璃这类透明物体的检测算法改进,或是小样本场景下的状态识别研究。通过摄像头采集车窗、挡风玻璃的图像,算法自动检测玻璃清洁度,若识别到脏污影响视线,及时提醒运维人员清洁,避免因玻璃脏污引发的安全事故,提升交通出行的安全性。 阅读详情

相关推荐

有源滤波电路设计

目录一、低通滤波器1、同相输入低通滤波器(1)一阶低通滤波电路(2)二阶低通滤波电路(压控电压源;Sallen-Key)2、反相输入低通滤波器(1)一阶低通滤波电路(2)二阶低通滤波电路(无限增益多路反馈)二、高通滤波器1、同相输入高通滤波器(1)一阶高通滤波电路(2)二阶高通滤波电路(压控电压源;Sallen-Key)2、反相输入高通滤波电路(1)二阶高通滤波电路(无限增益多路反馈) 一、低通滤波器 1、同相输入低通滤波器 (1)一阶低通滤波电路 即在一阶无源低通滤波器的基础上,加了一个集成运放。 它的

qq_41873236的博客 3万+

c#基础

1.静态成员和非静态成员的区别? A:静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问 不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问 B:一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值 C:静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等 2.cons...

weixin_30399155的博客 185

百度地图街景图像批量获取

由于个人研究需要在最近试了一下使用API获取百度地图街景图片,在此介绍一下基于我个人需求的百度街景批量获取方法,本文以Python编码作为主要方法,如果对零编码工具有需要的可以关注一下UA城市分析小组刚刚发布的街景图片获取工具。 街景图像用作区域细粒度空间指标测度需要解决几个问题。 1. 首先就是调用额度的限制,现在百度对于个人认证开发者每天可用的街景图像调用额度为100张,在不考虑购买额度上限(1万张600元,其实有经费的前提下可以直接考虑钞能力)的情况下动辄几千上万张的爬取数量会大大增加需要爬取的时间周

boycetoon29的博客 1万+

C#基础概念二十五问

 1.静态变量和非静态变量的区别?    2.const 和 static readonly 区别?    3.extern 是什么意思?    4.abstract 是什么意思?    5.internal 修饰符起什么作用?    6.sealed 修饰符是干什么的?    7.override 和 overload 的区别?    8.什么是索引指示器?   

Alibert的专栏 721

视觉SLAM十四讲--第13讲 实践:设计SLAM系统(最详细的代码调试运行步骤)

最详细的代码调试运行避坑说明,也包含了我自己对代码的理解,如有理解错误的地方,欢迎指正交流。

记录和分享 1万+

Nexus7二代刷机教程(新手向)

该教程将使用lineageos(Android 11),同时借鉴了lineage官方的教程和songelf的教程。

2403_84391487的博客 5214

(保存)C#基础概念二十五问

C#基础概念二十五问 注:本文部份资料来自网络,如有侵权,请与我联系,我会在第一时间声明引用或将其删除!     当初学 C# 时是找个人大概问了一下数据类型和分支语句就开始做项目了。这两天又全面的看了一下相关的基础知识(学而时习之嘛),总结了25个问题: 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abs...

weixin_34087307的博客 273

SPSS&Mplus—共同方法偏差(Common Method Bias)控制与检验

共同方法偏差(Common Method Bias)的控制方法:程序控制(Procedural)和统计控制(Statistical)。

m0_54401011的博客 1万+

C#基础二十五问

  当初学 C# 时是找个人大概问了一下数据类型和分支语句就开始做项目了。这两天又全面的看了一下相关的基础知识(学而时习之嘛),总结了25个问题:1.静态成员和非静态成员的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal 修饰符起什么作用?6.sealed 修饰符是干什么的?7.override

李涛的技术专栏 1085

55、宇宙微波背景辐射望远镜及其光学系统解析

本文详细解析了宇宙微波背景辐射(CMB)望远镜及其光学系统的设计与优化。内容涵盖折射与反射光学系统的特性、旁瓣控制技术、气球与地面观测系统的对比、探测器阵列的发展、光学系统设计流程以及不同观测场景下的光学系统选择。同时,文章展望了CMB望远镜光学系统的未来发展趋势,包括技术创新、多频段观测、国际合作与大型项目等。通过系统性的分析与对比,为CMB研究提供了全面的技术支持与理论基础。

f9g0h的博客 143

手把手教你学Simulink--进阶电机控制场景实例:基于Simulink的直流电机双闭环调速系统抗负载扰动仿真

摘要:本文基于Simulink平台构建直流电机双闭环调速系统,重点研究其在工业传送带场景下的抗负载扰动性能。系统采用转速外环(稳速)和电流内环(限流)的嵌套结构,通过工程法整定PI参数,实现了转速跌落<10%、恢复时间<0.5s的优异抗扰性能。仿真结果表明,相比单闭环系统,双闭环控制使转速跌落率降低47%,恢复时间缩短75%。文中详细介绍了数学模型建立、Simulink模块实现及参数优化方法,并提供了完整代码和模型文件,为电机控制系统设计提供实用参考。

MHD0815的博客 179

C#基础概念二十五问[转载]

C#基础概念二十五问[转载] 当初学 C# 时是找个人大概问了一下数据类型和分支语句就开始做项目了。这两天又全面的看了一下相关的基础知识总结了25个问题:1.静态成员和非静态成员的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal 修饰符起什么作用?6.sealed 修饰符是干什么的?

DelayNoMore的专栏 691

别再盯着那 100 条数据了,RAP OData 分页机制到底在保护什么

摘要: SAP BTP ABAP Environment 的 OData 服务默认采用分页保护机制,未指定 $top 时仅返回100条数据并附带下一页链接。这种设计旨在防止资源滥用,而非服务故障。客户端应遵循OData协议规范,直接使用服务端返回的 next link 进行分页请求,而非自行构造URL。当指定 $top 参数时,若数值超过5000仍会被强制分页。该机制在SAPUI5控件中被自动处理,但自定义客户端需主动实现分页逻辑。对于自定义实体(Custom Entity),开发者需在Query Prov

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 861

[转] C#基础概念二十五问

C#基础概念二十五问  当初学 C# 时是找个人大概问了一下数据类型和分支语句就开始做项目了。这两天又全面的看了一下相关的基础知识(学而时习之嘛),总结了25个问题: 1.静态变量和非静态变量的区别? 2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed 修饰符是干

363

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: C#-基础概念二十五问
下一篇: C++-指针常量和常量指针
MasterFT
博客等级 码龄20年 48粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值