C#语言基础常见问题汇总

C#语言基础(2) C#语言基础(2) 本篇继续关于C#语言学习的笔记,内容依然十分基础,且十分零碎,这里只记录一些较为关键有用的内容,更多的内容还要阅读相关书籍(C#入门经典)。开始本次的笔记: .Net.Framework 在上篇笔记中粗略的讲述了C#的相关历史发展,这里稍微详细记录一下。 .NET.Framework是.NET程序开发和运行的环境,主要由两个部分组成:公共语言运行时,类库。 CLS 公共语言规范... 阅读详情

C#语言基础常见问题汇总

概述

1.       什么是C#?   

C#是Microsoft公司设计的一种编程语言。它松散地基于C/C++,并且有很多方面和Java类似。Microsoft是这样描述C#的:“C#是从C和C++派生来的一种简单、现代、面向对象和类型安全的编程语言。C#(读做‘Csharp’)主要是从C/C++编程语言家族移植过来的,C和C++的程序员会马上熟悉它。C#试图结合Visual Basic的快速开发能力和C++的强大灵活的能力。” 

2.       如何开发C#应用程序?    

.NET SDK包括了C#命令行编译器(csc.exe),下一个版本的Visual Studio (Visual Studio 7 or Visual Studio.NET)会包含对C#开发的完整支持。 
3. C#可以取代Java?   

    C#
非常像Java语言——这两种语言的核心和C++相比都有相似的优缺点。例如,两个语言都有垃圾回收,但是两个语言都没有模板(template)。Microsoft已经中止了Visual J++产品,因此很难不认为Microsoft在使用C#来替代Java。 
4. C#
可以取代 C++?   

   
显然是不,但是我们又很难说C++是新的.NET平台上编写代码的最佳选择。为了使.NET的运行层能完全发挥作用,它要求编程语言遵循某些特定的规则——其中之一就是所有的语言类型必须遵守通用类型系统(Common Type System,CTS)。不幸的是,许多C++特性不能被CTS支持。例如,模板和类的多重继承。 
    Microsoft
对这个问题的答案是给C++提供可管理的扩展(Managed Extensions,ME), 这可以使C++遵守CTS。通过添加新的关键字来标记C++类有CTS的属性(例如.-gc表示垃圾回收)。但是在创建新的工程时很难讲为什么ME C++会比C#更合适。就特征(feature)而言它们很相似,但与C++不同的是C#从一开始就以.NET为环境设计的。ME C++存在的理由好像是将C++代码移植(port)为.NET环境下的代码。 

因此,这个问题的答案,很可能是C++作为一个.NET环境之外的语言将依然保留它的重要性;而通过ME将现存的C++代码移植为适合.NET环境;但是很可能C#将是C++开发者开发新的.NET应用程序的最好选择。 
8. C#
是面向对象的吗?   

是的,C#像Java和C++一样,是一个面向对象的语言。 
9. C#
有自己的类库吗
?   
   
不,就像所有的.NET语言(VB.Net,JScript .Net...)一样,C#访问.NET类库,C#没有自己的类库。
 
基本类型 

1
. C#提供什么标准类型?    
   
C# 支持的基本类型和C++很相似,包括int, long, float, double, char, string, arrays, structs 和 classes。然而,不要假设太多,名字可能很形似,但是一些细节不相同。例如C#中的long是64位的,而C++的long取决于平台,32位的平台上是32位的,64位的平台上是64位的。class和struct在C++中几乎完全一样,但在C#中并不是这样的。
 
2
. 是否所有的C#类型都派生于一个公共的基类?   

   
是,也不是,所有的对象都可以看作从Object (System.Object)派生而来。但是为了把像int,float这样的值类型实例看作是从Object对象派生的,这个实例必须通过一个装箱的操作(boxing)转化为引用类型。理论上,开发者可以忽略这些底层的转化,但是认识到这点对于系统性能影响很重要。 
3
. 是否可以这样认为,可以将一个值类型的实例作为参数传给以对象为参数的方法?
   
   
是的,例如:

class CApplication {
public static void Main()

{

int x = 25;
string s = “fred”;
DisplayMe( x );
DisplayMe( s ); }
static void DisplayMe( object o )

{

System.Console.WriteLine( “You are {0}”, o );

}

}
将显示:

You are 25
You are fred 


4
. 值类型和引用类型的最基本的区别是什么?   
    C#
将类型分为两类,一类是值类型,另一类是引用类型。大部分固有的基本类型(如int, char)是值类型,structs 也是值类型。引用类型包括类、接口、数组和字符串。基本的概念非常简单,那就是一个值类型的实例代表了实际的数据(存在栈中),而一个引用类型的实例代表指向数据的指针或者引用(存在堆中)。 
    C++
开发者最容易混淆的地方是:C#已经自己预定义了一些类型作为值类型,一些作为引用类型,而一个C++的开发者希望能够自己控制。

例如,在C++中,我们可以这样做:
int x1 = 3; // x1
是堆栈上的值

int *x2 = new int(3) // x2
是堆的一个值的引用

但是在C#中没有这样的控制:

int x1 = 3; // x1
是堆栈上的值

int x2 = new int();
x2 = 3; // x2
还是堆栈上的值
! 
5. 既然 int是值类型,而 class是引用类型,那么int是怎样从Object派生的呢?   

   
是这样的,当int用作int时候,这是一个值类型(在栈上),然而,当它用作是Object时,这是一个引用堆上的整数值的引用类型。换而言之,当你将int看作对象时,运行层将它自动转化为对象引用,这个转化过程称作装箱(boxing)。这个转换包括将栈里的值拷贝到了堆里,并且新建了一个对象的实例来引用该值。拆箱操作(unboxing)是个反过程——将对象转化为基于栈的值类型。
int x = 3;
// 堆栈上新的int类型,值为3
object objx = x;
// 堆上新的int, 设定值为3,x=3仍然在堆栈上
int y = (int)objx;
//新的int类型的值3在堆栈上,x=3在堆栈上,objx=3在堆上 
6. C#使用引用替代指针,那么C#的引用和C++的引用一样吗?   
  
不完全,基本的思想是一样的,但是一个重要的区别是C#的引用可以是null。因此你不能确认C#的引用一定会是一个有效的对象。如果试图使用一个值为null的引用,一个NullReferenceException 异常将被抛出。
例如,看一看以下的方法:
void displayStringLength( string s )

{

Console.WriteLine( “String is length {0}”, s.Length );

}

如果这样调用它,这种方法将产生一个NullReferenceException 异常:
string s = null;
displayStringLength( s );
   
当然有些情况你认为产生这样一个异常是完全可以接受的结果,但是在这个例子里最好按下面的代码改写一下:

void displayStringLength( string s )

{

if( s == null )

Console.WriteLine(“String is null”);

else

Console.WriteLine(“String is length {0}”, s.Length );

} 

class和struct 

1.    struct在C++中是多余的,为什么C#还要使用它们呢?    

在C++中,一个结构和一个类几乎就是一个同样的东西。唯一的区别是缺省的成员的访问级别不一样(struct的缺省级别是public,class的缺省级别是private)。然而,在C#中struct和class完全不一样。在C#中,struct 是值类型,而class是引用类型。另外struct不能从其他struct或者class继承,尽管struct可以实现接口。struct没有析构器。 

2. C#支持多重继承吗?    

C#支持接口的多重继承,但是不支持类的多重继承。 
3. C#接口和C++抽象类一样吗?
   
   
不,不完全。C++的抽象类不能被实例化。但是它可以(而且经常是)包含执行代码和数据成员。一个C#接口不能包含任何执行代码或数据成员,它只是一组方法名称和签名(signature)。一个C#的接口更像是一个COM接口而不是抽象类。
 
   
另一个主要的不同点是:C#类只能从一个类(不管是否抽象)继承,但可以实现多重接口。 

4. C#构造器和C++ 构造器是否相同?   

非常相似,但是它们绝对不同。第一,C#析构器不保证在某个特定的时间被调用。实际上它根本不保证被调用。真实的情况是,C#析构器只是一个伪装了的Finalize方法。具体点讲,它是一个插入调用基类Finalize方法的Finalize方法。因此,这段代码:

class CTest

{

~CTest()

{

System.Console.WriteLine(“Bye bye” );

}

}

实际上就是:
class CTest

{

protected override void Finalize()

{

System.Console.WriteLine(“Bye bye” );

base.Finalize();

}   

} 

如果你不相信,可以将一个 Finalize方法和一个析构器加入C#类中,然后就可以知道是如何编译的了。 

5. 什么是静态构造器?   

它是整个类的一个构造器,而不是类的一个实例的构造器,它在类装载的时候被调用。 
6. C#中所有的方法都是虚方法吗?
   
   
不,像C++一样,缺省的时候,方法不是虚拟的,但都可以改为虚拟的。
 
7. 怎样在C#中声明一个纯虚函数?
   
   
在方法前使用abstract修饰符,类也可以标记为abstract(这是自然的)。注意,abstract方法不能有执行代码(不同于C++中纯虚方法)。
 
和C++处理的不同 

1. 我“new”了一个对象,但是我怎样删除它?  

  你不能,不允许你显式地调用析构器,也没有delete操作符。但是不必担心,垃圾回收(garbage collection)会释放你的对象,最终会的(也许会的)。 
2. 我试图在栈上建立一个对象,但是C#编译器不通过,这是怎么回事?
    
   
和C++不同,你不能在栈上建立一个对象的实例。类的实例总是被建立在堆上并且接受垃圾回收器(garbage collection)的管理。
 
3. 我定义了一个析构器,但是它从来不能被调用,为什么?
    
   
一个C#析构器实际上是Finalize方法的实现,但是运行环境不保证调用Finalize方法。你可以考虑通过调用GC.RequestFinalizeOnShutdown()方法试一下。
 
4. 大多数的C#基本类型和C++的基本类型有相同的名字,它们一样吗?
   
   
不,C#中char和C++中的wchar是相同的。C#中所有的字符包括字符串都是Unicode的,C#中整型值是固定大小的,而在C++中其大小取决于处理器。例如,一个C#的int是32位的,而C++ 中int在32-bit处理器上是32位的,在64-bit处理器上是64位的,一个C#的long是64位的。 

从零实现高精度手势检测:OpenCV+MediaPipe模型移植实战(2)(附c++完整代码) 上篇已经介绍了手掌检测的方法。本章将在手掌检测的基础上,完成手指关节的检测。 阅读详情

相关推荐

别再傻傻分不清了!Anaconda和Miniconda到底选哪个?附保姆级安装与镜像源配置(Windows/Mac)

本文详细解析了Anaconda和Miniconda的核心差异,包括体积、预装内容、系统资源占用等关键维度,并提供了针对不同需求的决策框架。附有Windows和Mac双平台的详细安装与配置指南,帮助用户根据实际需求选择最适合的conda工具,提升开发效率。

weixin_30315723的博客 426

C#语言基础常见问题汇总(1)

1. 什么是C#?    C#是Microsoft公司设计的一种编程语言。它松散地基于C/C++,并且有很多方面和Java类似。Microsoft是这样描述C#的:“C#是从C和C++派生来的一种简单、现代、面向对象和类型安全的编程语言。C#(读做‘Csharp’)主要是从C/C++编程语言家族移植过来的,C和C++的程序员会马上熟悉它。C#试图结合Visual Basic的快速开发能力和C+

yuanxi的专栏 1114

RK3568点不亮EK79007 MIPI屏?别急着改时序,先检查这个初始化命令

本文深入解析RK3568开发板调试EK79007 MIPI屏幕时初始化命令的关键作用,揭示80%的时序问题实际源于命令配置不当。通过典型故障案例,详细拆解初始化命令的调试方法、寄存器映射及系统化排查流程,帮助工程师快速定位和解决屏幕点亮问题。

weixin_33657090的博客 349

C#面试常见问题及答案

1 (1)面向对象的语言具有__继承性_性、_封装性_性、_多态性 性。 (2)能用foreach遍历访问的对象需要实现 _ IEnumerable 接口或声明_ GetEnumerator 方法的类型。1.c#中的三元运算符是__? :__ 2.当整数a赋值给?个object对象时,整数a将会被__装箱___? 3.类成员有__3__种可访问形式? 4.public stati

Andrewniu的博客 4658

Quanto option期权公式推导(更新中)

Quanto期权不同于以标的股票或资产的计价货币支付最终收益的普通欧式期权,它以另一种货币以预先确定的汇率支付最后的收益。以股票B的计价货币来计价的quanto看涨期权的收益为F0×max⁡(Sa(T)−K,0)×Sb(T)F_0 \times \max(S_a(T)-K, 0) \times S_b(T)F0​×max(Sa​(T)−K,0)×Sb​(T) 其中SaS_aSa​以货币A计价,SbS_bSb​以货币B计价,F0F_0F0​是预先固定的汇率. 假设上述股票均遵循几何布朗运动,可以得到以下恒等式

qq_41782124的博客 3683

如何在Android上使用OpenCV进行摄像头标定

如何在Android上使用OpenCV进行摄像头标定,我们这里使用官方一个例程,其实并不难,只是网上的资料少了而已。相机标定是计算机视觉工作的前提,为了确定相机矩阵和畸变参数。

花草的博客 3440

C#语言基础原理及优缺点

C#是专门为.net程序框架而创造的语言。 .net框架有ms的.netFramework, Mono的.NetFramework。 net程序编译和执行过程中的流程图: 优点: 缺点: 总结:

自由理想的足迹 2万+

AI编程助手Cursor如何革新经济学研究:从计量模型到可视化全流程实战

在数据科学和人工智能技术蓬勃发展的今天,如何高效地将前沿AI工具融入专业领域的研究工作流,成为提升科研效率的关键。其核心原理在于通过自然语言交互,将研究者的专业问题转化为机器可执行的指令,从而实现人机协作的范式转移。这一技术的核心价值在于大幅降低非计算机背景研究者的编程门槛,将精力从繁琐的代码实现中解放出来,更聚焦于学科本身的思想与逻辑。尤其在经济学、金融学等高度依赖数据分析和计量建模的领域,AI编程助手能够快速处理数据清洗、模型估计、可视化及结果解释等任务。具体到应用场景,研究者可以利用结构化提示词工程,

weixin_42531579的博客 296

艾伟_转载:C#语言基础常见问题汇总

  概述   1、什么是C#?   C#是Microsoft公司设计的一种编程语言。它松散地基于C/C++,并且有很多方面和Java类似。   Microsoft是这样描述C#的:“C#是从C和C++派生来的一种简单、现代、面向对象和类型安全的编程语言。C#(读做‘Csharp’)主要是从C/C++编程语言家族移植过来的,C和C++的程序员会马上熟悉它。C#试图结合Visual Basic的快速...

weixin_34377065的博客 130

C#与欧姆龙PLC 通信——Fins Tcp协议

该调试助手专门为了帮助大家学习以及测试Fins-Tcp通信,下面进行详细介绍。

qq_34059233的博客 2082

YOLOv11改进策略【卷积层】| DEConv: 强度信息与梯度特征融合的细节增强 适用于小目标与细节目标检测任务

本文记录的是利用 模块优化 的目标检测网络模型。(Detail-Enhanced Convolution,细节增强卷积)的设计旨在,解决 目标检测网络中传统普通卷积缺乏目标细节相关先验、对小目标边缘、目标与背景边界等关键细节捕捉能力不足的问题,同时避免引入额外参数量与计算开销,以适配 对实时推理性能与检测精度的双重需求。DEA-Net: Single image dehazing based on detail-enhanced convolution and content-guided atte

Limiiiing的博客 1496

深度源码评测:ARM CMSIS-5架构全景与嵌入式项目选型落地

在嵌入式开发中,面向Cortex-M处理器的软件框架是连接芯片与应用的桥梁。CMSIS-5作为ARM官方维护的核心标准,将内核寄存器访问、系统初始化、DSP算法库及RTOS接口统一封装,形成了层次分明的模块化体系。其通过编译宏与弱符号等机制,实现了跨编译器、跨芯片的可移植性,大幅降低了工程治理的复杂度。无论是裸机开发、RTOS移植,还是音频、电机控制等数值密集型场景,合理利用CMSIS-5的模块分层都能提升开发效率与代码质量。本文从源码角度全面剖析CMSIS-5的架构设计、关键接口与工程实践,并给出针对不同

weixin_34167819的博客 348

生成mm grounding dino的onnx模型并在x-anylabeling中使用

X-AnyLabeling 是一款cvhub开发的交互式自动标注工具,其基于AnyLabeling进行构建和二次开发,在此基础上扩展并支持了许多的模型和功能,并借助Segment Anything和YOLO等主流模型提供强大的 AI 支持。其最新版基于grounding dino可以实现开放词汇检测及生成掩码。2024年,MMDet 3.3.0提出了 MM-Grounding-DINO。

blanokvaffy的博客 1729

c# datatable分类汇总

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; namespace CpmBigDataImportService { /// <summary> /// 内存表分类汇总 /// </sum...

qq_42678477的博客 4470

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

最全C#自学资源汇总

C#自学资源汇总 C# 是一个简单的、现代的、通用的、面向对象的编程语言,是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计语言。 C#可以用来开发网站、桌面程序、xamarin跨平台开发手机、物联网应用。 来自知乎:布莱恩特 https://zhuanlan.zhihu.com/p/157656895 1.适合初学者的视频和教程 开发者工具下载 https://msdn.itellyou.

qq_57222058的博客 7052

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C# 语言基础全面解析

本文介绍了 C# 语言的基础内容,包括基本语法、数据类型、变量和常量、运算符、控制结构以及方法等。这些基础知识是进一步学习 C# 编程的基石,通过不断实践和深入学习,你将能够利用 C# 开发出各种功能强大的应用程序。

zsnandzmn的博客 1251

【博主推荐】C#的winfrom应用中datagridview常见问题及解决方案汇总

【博主推荐】C#的winfrom应用中datagridview常见问题及解决方案汇总,datagridview绘制出现鼠标悬浮数据变空白;datagridview在每列前动态添加序号;datagridview改变行样式;datagridview后台修改指定列数据;datagridview固定某个列宽;datagridview某个列的显示隐藏;datagridview获取选中的值;清空datagridview的几种方式;datagridview单击双击事件;datagridview绘制按钮等。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 1684

C#资料汇总

C#资料汇总参考 参考 1、Microsoft的C# 指南

天道酬勤 1457

第三章 C#语言基础

第三章 C#语言基础

她是不会无条件的!! 1468

C#语言基础

一些主流编程语言1.C:嵌入式硬件开发2.C++:游戏客户端,服务器,软件3.C#:游戏客户端,服务器,软件,网站4.Java:安卓,服务器,软件,网站5.JavaScript:网站,服务器6.PHP:网站,服务器7.Python:网站,服务器,辅助开发8.SQL:数据库9.Go:服务器10.:mac,ios开发11.Swift:mac,ios开发使用IDE。

qq_55071342的博客 1892

C# dataTable分组汇总 , distinct

using System; using System.Data; using System.Linq; namespace ConsoleApp1 { class Program { static void Main(string[] args) { DataTable dt = new DataTable("cart"); DataColumn dc1 = new DataColumn("time", Ty...

学长的猫的博客 4539
上一篇: 2008年度工作总结
下一篇: java程序员面试必备的32个要点
beyondzhx
博客等级 码龄25年 119粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值