20道C#面试题让你收 Offer 收到不停

Posted 苏州程序大白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20道C#面试题让你收 Offer 收到不停相关的知识,希望对你有一定的参考价值。

20道C#面试题,让你收Offer收到不停

在这里插入图片描述

1、NET Core 与 .NET Framework 的区别?

问:NET Core 与 .NET Framework 的区别?
答:.NET Core 就是 .NET Framework 的开源且跨平台版本。但微软毕竟不能维护两个不同的分支,一个跑在Windows上,一个跑在Linux(Unix Like)系统上,所以微软抽象出来一个标准库.NET Standard Library,.NET Core 与 .NET Framework 都必须实现标准库的API ,就这样.NET Core、.NET Framework、Xamarin成了三兄弟,分别为不同的平台服务。

2、C# 中static关键字的作用?

问:C# 中static关键字的作用?
答:对类有意义的字段和方法使用static关键字修饰,称为静态成员,通过类名加访问操作符“.”进行访问; 对类的实例有意义的字段和方法不加static关键字,称为非静态成员或实例成员。
注: 静态字段在内存中只有一个拷贝,非静态字段则是在每个实例对象中拥有一个拷贝。而方法无论是否为静态,在内存中只会有一份拷贝,区别只是通过类名来访问还是通过实例名来访问。

3、Java同步关键字的C#版本?
问:c#是否具有自己的java“ synchronized”关键字版本?
即在Java中,可以将其指定为函数,对象或代码块,如下所示:

public synchronized void doImportantStuff() 
{
   // dangerous code goes here.
}

要么

public void doImportantStuff()
 {
   // trivial stuff

   synchronized(someLock) {
      // dangerous code goes here.
   }
}

答:首先-大多数类将永远不需要是线程安全的。使用YAGNI:仅当你知道实际上将要使用它(并对其进行测试)时,才应用线程安全性。
对于方法级的东西,有[MethodImpl]:

[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}

这也可以用于访问器(属性和事件):

private int i;public int SomeProperty
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    get { return i; }
    [MethodImpl(MethodImplOptions.Synchronized)]
    set { i = value; }
}

请注意,默认情况下,类似字段的事件是同步的,而自动实现的属性则不是:

public int SomeProperty {get;set;}              // not synchronized
public event EventHandler SomeEvent;            // synchronized

就个人而言,我不喜欢使用MethodImpl锁this或typeof(Foo)-这是违反最佳做法的实现。首选选项是使用自己的锁:

private readonly object syncLock = new object();
public void SomeMethod() 
{
    lock(syncLock) { /* code */ }
}

注意,对于类似字段的事件,锁定实现取决于编译器。在较旧的Microsoft编译器中,它是lock(this)/ lock(Type)-但是,在较新的编译器中,它使用Interlocked更新-因此具有线程安全性而没有令人讨厌的部分。

这允许更精细的用法,并允许使用Monitor.Wait/ Monitor.Pulseetc在线程之间进行通信。

4、如何在C#中将数据表绑定到datagridview?

问:需要将 DataTable 绑定到 DataGridView 。我这样做:

    DTable = new DataTable();
    SBind = new BindingSource();
    //ServersTable - DataGridView
    for (int i = 0; i < ServersTable.ColumnCount; ++i)
    {
        DTable.Columns.Add(new DataColumn(ServersTable.Columns[i].Name));
    }

    for (int i = 0; i < Apps.Count; ++i)
    {
        DataRow r = DTable.NewRow();
        r.BeginEdit();
        foreach (DataColumn c in DTable.Columns)
        {
            r[c.ColumnName] = //writing values
        }
        r.EndEdit();
        DTable.Rows.Add(r);
    }
    SBind.DataSource = DTable;
    ServersTable.DataSource = SBind;

但我得到的是 数据表中 增加了新的 列到我 的DataGridView 。我不需要这个,我只需要在现有列下编写即可。

答:有这种办法:

ServersTable.Columns.Clear();
ServersTable.DataSource = SBind;

如果您不想清除所有现有的列,则必须DataPropertyName为每个现有的列进行设置,如下所示:

for (int i = 0; i < ServersTable.ColumnCount; ++i) 
{
  DTable.Columns.Add(new DataColumn(ServersTable.Columns[i].Name));
  ServersTable.Columns[i].DataPropertyName = ServersTable.Columns[i].Name;
}

5、C#WinForms ErrorProvider控件

问:是否有一种方法来获取具有ErrorProvider图标处于活动状态的控件的列表。即。验证失败的任何控件。我试图避免循环窗体中的所有控件。
我想显示某种消息,指示表单上有多少错误。由于我的表单包含选项卡,因此我试图使用户知道不活动的选项卡上可能存在错误,因此他们需要检查所有选项卡。

答:这属于“你怎么 不 知道”
类别。是您的代码正在调用ErrorProvider.SetError(),您应该可以轻松跟踪仍在活动的错误数量。这是一个小帮手类,使用其SetError()方法更新ErrorProvider。其Count属性返回活动错误的数量:

  private class ErrorTracker {
  private HashSet<Control> mErrors = new HashSet<Control>();
  private ErrorProvider mProvider;

  public ErrorTracker(ErrorProvider provider) { 
    mProvider = provider; 
  }
  public void SetError(Control ctl, string text) {
    if (string.IsNullOrEmpty(text)) mErrors.Remove(ctl);
    else if (!mErrors.Contains(ctl)) mErrors.Add(ctl);
    mProvider.SetError(ctl, text);
  }
  public int Count { get { return mErrors.Count; } }
}

6、C#的比较浮点值?
问:比较浮点值中不得使用==或!=运算符比较浮点值。大多数浮点值没有精确的二进制表示形式,并且精度有限。如果是这样,比较两个浮点值的最佳方法是什么?

答:扩展方法对于实现Kevin的建议可能有用:

public static bool IsEqualTo(this double a, double b, double margin)
{
    return Math.Abs(a - b) < margin;
}
public static bool IsEqualTo(this double a, double b)
{
    return Math.Abs(a - b) < double.Epsilon;
}

现在,您可以执行以下操作:
if(x1.IsEqualTo(x2)) ...if(x1.IsEqualTo(x2, 0.01)) ...
只需将更IsEqualTo改为更合适的名称,或double.Epsilon在需要时将默认边距更改为比更好的值。

7、C#:DataGridView控件中的多行文本
问:DataGridView控件是否可以在单元格中显示多行文本?

答:可以将DefaultCellStyle.WrapModecolumn的属性设置为DataGridViewTriState.True。之后,单元格中的文本将正确显示。
示例(DataGridView一栏):

dataGridView1.Columns[0].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dataGridView1.Rows.Add("test" + Environment.NewLine + "test");

(Environment.NewLine= \\r\\n在Windows中)

8、C#泛型类型的集合

问:有一个通用类:

public class MyClass<T> 
{
  public T Value;
}

我想实例化几个项目,例如…

new MyClass<string>new MyClass<int>

…并将它们添加到集合中。如何定义集合,使其可以容纳泛型类型列表?然后,我想在某个时刻迭代集合,并使用Value属性。可能?

答:泛型类从非泛型基类继承,或实现一个非泛型接口。然后,拥有此类型的集合,并将其转换为用于访问集合内容的任何代码。
这是一个例子:

public abstract class MyClass
{
    public abstract Type Type { get; }
}
public class MyClass<T> : MyClass
{
    public override Type Type
    {
        get { return typeof(T); }
    }

    public T Value { get; set; }
}
// VERY basic illustration of how you might construct a collection// of MyClass<T> objects.public class MyClassCollection
{
    private Dictionary<Type, MyClass> _dictionary;

    public MyClassCollection()
    {
        _dictionary = new Dictionary<Type, MyClass>();
    }

    public void Put<T>(MyClass<T> item)
    {
        _dictionary[typeof(T)] = item;
    }

    public MyClass<T> Get<T>()
    {
        return _dictionary[typeof(T)] as MyClass<T>;
    }
}

9、C# 中如何实现线程同步?

问:C# 中如何实现线程同步?

答:
(1)方法一:阻塞(调用Sleep()或Join())
(2)方法二:加互斥锁lock
(3)方法三:信号和句柄(AutoResetEvent/ManualResetEvent,调用Set()和WaitOne())

10 、C#中堆和栈的区别?

问:C#中堆和栈的区别?

答:答 栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。 堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。

存放在栈中时要管存储顺序,保持着先进后出的原则,他是一片连续的内存域,有系统自动分配和维护;
堆是无序的,他是一片不连续的内存域,有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。
栈内存无需我们管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC清理。
使用引用类型的时候,一般是对指针进行的操作而非引用类型对象本身。但是值类型则操作其本身。

11、简述private、protected、pubic、internal修饰符的访问权限

问:简述private、protected、pubic、internal修饰符的访问权限

答:
private : 私有成员, 在类的内部才可以访问(只能从其声明上下文中进行访问)
protected : 保护成员,该类内部和从该类派生的类中可以访问
Friend:友元 ,声明 friend 元素的程序集中的代码可以访问该元素,而不能从程序集外部访问
Protected Friend:在派生类或同一程序集内都可以访问
public : 公共成员,完全公开,没有访问限制
internal: 在同一命名空间内可以访问

12、C#中的委托是什么?事件是不是一种委托?

问:C#中的委托是什么?事件是不是一种委托?

答: 委托是将一种方法作为参数代入到另一种方法。 是,事件是一种特殊的委托。 //比如:onclick事件中的参数就是一种方法。

13、C#什么是序列化与反序列化?

问:C#什么是序列化与反序列化?

答:序列化:将对象状态转换为可保持或传输的格式的过程。将对象实例的字段及类的名称转换成字节流,然后把字节流写入数据流
反序列化:将流转换为对象。
这两个过程结合起来,可以轻松地存储和传输数据。

14、什么是虚函数?什么是抽象函数?

问:什么是虚函数?什么是抽象函数?

答: 虚函数:没有实现的,可由子类继承并重写的函数。Virtual CallSomeOne();
抽象函数:规定其非虚子类必须实现的函数,必须被重写。public abstract void CallSomeOne();

15、如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理?

问:如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理。

答:可以用 this.Server.Transfer。

16、C#中<%# %> 和 <% %> 有什么区别?

问:C#中<%# %> 和 <% %> 有什么区别?

答:<%# %>表示绑定的数据源
<%%>是服务器端代码块

17、C# 中如何操作文件I/O?

问:C# 中如何操作文件I/O。

答:通过流的方式对文件进行读写操作
(1)FileStream
(2)StreamReader/StreamWriter

18、C#中数据库操作的相关类有哪些?

问:C#中数据库操作的相关类有哪些?
答:特定类:Connection,Command,CommandBuilder,DataAdapter,DataReader,Parameter,Transaction
共享类:DataSet,DataTable,DataRow,DataColumn,DataRealtion,Constraint,DataColumnMapping,DataTableMapping

(1)Connection:开启程序与数据库之间的连接。
(2)Command:对数据库发送一些指令。例如增删改查等指令,以及调用存在数据库中的存储过程等。
(3)DataAdapter:主要在数据源及DataSet 之间执行传输工作,通过Command 下达命令后,将取得的数据放进DataSet对象中。
(4)DataSet:这个对象可视为一个暂存区(Cache),可以把数据库中所查询到的数据保存起来,甚至可以将整个数据库显示出来,DataSet是放在内存中的。
备注:将DataAdapter对象当做DataSet 对象与数据源间传输数据的桥梁。DataSet包含若干DataTable、DataTableTable包含若干DataRow。
(5)DataReader:一笔向下循序的读取数据源中的数据。
总结:http://ADO.NET 使用Connection对象来连接数据库,使用Command或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader或DataAdapter,然后再使用取得的DataReader或DataAdapter对象操作数据结果。

19、C#中XML与 HTML 的主要区别?

问:C#中XML与 html 的主要区别

答:XML是区分大小写字母的,HTML不区分。
在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略。

20、在C#中解析SQL代码

问:使用C#解析SQL代码。

具体来说,是否有任何免费的解析器可以解析SQL代码并从中生成树或任何其他结构?它还应为嵌套结构生成适当的树。
它还应该返回该树的节点代表哪种语句。
例如,如果节点包含循环条件,则它应返回这是节点的“循环类型”。
还是有什么方法可以解析C#中的代码并生成想要的类型的树?

答:
使用Microsoft 实体框架(EF)。
它具有一个“ Entity SQL”解析器,该解析器可构建表达式树,

using System.Data.EntityClient;
...EntityConnection conn = new EntityConnection(myContext.Connection.ConnectionString);
conn.Open();EntityCommand cmd = conn.CreateCommand();
cmd.CommandText = @"Select t.MyValue From MyEntities.MyTable As t";
var queryExpression = cmd.Expression;....conn.Close();

关注苏州程序大白,持续更新技术分享。谢谢大家支持

以上是关于20道C#面试题让你收 Offer 收到不停的主要内容,如果未能解决你的问题,请参考以下文章

Android面试:整理了Android面试官最常问的174道面试题,让你秒变offer收割机

一道面试题让你更加了解事件队列

Java 面试收到offer必备 208 道面试题

25k成功入职京东:拿下这800道软件测试题,金三银四让你快速涨薪

有对象了不起?不如刷这800多道面试题,成功收割心仪公司的offer

2021年字节跳动74道高级程序员面试,已拿offer