惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy International News Feed
Martin Fowler
Martin Fowler
D
Docker
Y
Y Combinator Blog
云风的 BLOG
云风的 BLOG
U
Unit 42
T
Tailwind CSS Blog
J
Java Code Geeks
G
Google Developers Blog
MongoDB | Blog
MongoDB | Blog
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
美团技术团队
F
Fortinet All Blogs
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
The GitHub Blog
The GitHub Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recorded Future
Recorded Future
N
Netflix TechBlog - Medium
Google DeepMind News
Google DeepMind News
Hacker News: Ask HN
Hacker News: Ask HN
L
LINUX DO - 最新话题
Microsoft Security Blog
Microsoft Security Blog
N
News and Events Feed by Topic
I
Intezer
TaoSecurity Blog
TaoSecurity Blog
NISL@THU
NISL@THU
小众软件
小众软件
博客园 - 聂微东
博客园 - Franky
有赞技术团队
有赞技术团队
P
Palo Alto Networks Blog
爱范儿
爱范儿
H
Hacker News: Front Page
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Cisco Blogs
P
Proofpoint News Feed
I
InfoQ
Google DeepMind News
Google DeepMind News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Vercel News
Vercel News
H
Heimdal Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
量子位

博客园 - Forrest Gump

关于LINQ中数据库连接字符串的问题 项目开发经验-ASP.NET项目开发中的异常处理 关于模态窗口(showModalDialog)的专题【收藏】 C# 将数据导出到Excel汇总 关于Assembly.CreateInstance()与Activator.CreateInstance()方法 PowerDesigner概念设计模型(CDM)中的3种实体关系 C#基础概念二十五问 Microsoft .NET Pet Shop 4:将 ASP.NET 1.1 应用程序迁移到 2.0 用Inno Setup制作WEB程序安装包 冒泡法数组排序与 System.Array.Sort()排序性能比较 堆排序 (Heap sort) 合并排序法(Merge Sort) 希尔排序法 quick sort 关于switch的小技巧 C#中一些很基础但有经常导致错误的一些概念 Enterprise Library Step By Step系列(十六):使用AppSetting Application Block Enterprise Library Step By Step系列(十五):配置应用程序块——设计篇 创建基于消息队列(MSMQ)的异步日志
C#面试题
Forrest Gump · 2008-12-28 · via 博客园 - Forrest Gump

现在收集些常见面试题:

    将比较常见的C#面试题分布出来供有需求的朋友参考,本文章会不断更新。如果有好的面试题不妨给我留言,我来完善。
最好是有答案的。

   1:委托和事件

 //事件类
    public class EventClass
    
{
        
public void display(object sender, System.EventArgs e)
        
{
            Console.WriteLine(
"This is the Event Class");
            Console.ReadLine();
        }

    }

    
//调用类
    class InvokeClass
    
{
        
//声明代理对象,注意参数
        public delegate void delegateobj(object sender, System.EventArgs e);
        
//声明事件对象 
        private event delegateobj obj;
        
//声明要调用的事件类对象
        private EventClass ec;

        
public InvokeClass()
        
{
            ec 
= new EventClass();
            
//添加事件对象到事件队列中,参数为要调用的事件
            this.obj += new delegateobj(ec.display);
        }

        
//调用delegate对象触发事件
        protected void OnObj(System.EventArgs e)
        
{
            
if (this.obj != null)
            
{
                obj(
this, e);
            }

        }

        
public void RaiseEvent()
        
{
            EventArgs e 
= new EventArgs();
            OnObj(e);
        }

        
static void Main(string[] args)
        
{
            InvokeClass ic 
= new InvokeClass();
            Console.WriteLine(
"Please input a string");
            
string input = Console.ReadLine();
            
if (input.Equals(""))
            
{
                Console.WriteLine(
"Sorry,you don't input anything");
            }

            
else
            
{
                
//触发事件
                ic.RaiseEvent();
            }

        }

    }

      
      2:遍历页面中所有的TextBox,交将值设置成"a"
    
 

for (int j = 0; j < this.Controls.Count; j++)
            
{
                
foreach (object o in Page.Controls[j].Controls)
                
{
                   
                    
if (o is TextBox)
                    
{
                        TextBox txt 
= (System.Web.UI.WebControls.TextBox)o;
                        txt.Text 
= "A";
                    }

                   
                }

            }

       
        3  常用排序算法
        
 

 /// 


        
/// /冒泡排序
        
/// 

        private void BubbleSort()
        
{
            
//冒泡排序
            int[] list = new int[511112223854-5655 };//初始化数组
            int i, j, temp;
            
for (j = 1; j < list.Length; j++)
            
{
                
for (i = 0; i < list.Length - j; i++)
                
{
                    
if (list[i] > list[i + 1])
                    
{
                        temp 
= list[i];
                        list[i] 
= list[i + 1];
                        list[i 
+ 1= temp;
                    }

                }


            }

            

        }

        
/// 
        
/// 选择排序
        
/// 

        private void SelectSort()
        
{
            
//选择排序
            int[] a = new int[511112223854-5655 };//初始化数组
            int min, min_k;//定义最小数,和最小数的下标
            for (int i = 0; i < 5; i++)
            
{
                min 
= a[i];//将当前循环的数设置成最小数
                min_k = i;
                
for (int j = i + 1; j < 5; j++)
                
{

                    
if (a[j] < min)
                    
{
                        min 
= a[j];
                        min_k 
= j;
                        
int tem = a[min_k];
                        a[min_k] 
= a[i];
                        a[i] 
= tem;


                    }



                }



            }


        }

      
       4:结构体(Struct) 和 类(Class)
       

 

      对于结构和类,初看上去都一样。都可以有自己的字段,属性,方法,还能有构造函数。但是这两者其实有很大的不同,而且各自有各自的应用范围。下面还是谈谈两者的分别吧。

      <1> 结构的特点和性能优势

      结构是值类型,继承自System.ValueType。结构相对于类来说有两个性能上的优势,结构通常分配在栈(Stack)上面,类的实际内容通常分配在堆(Heap)上面,访问栈的速度会比访问堆的速度更快。但是这并不是一个明显的优势。最主要的是栈上面的内容释放是非常快的,通常在函数调用结束以后,栈就自动释放了;但是对于堆来说,必须等待垃圾收集器(Garbage Collector)来收集,往往垃圾收集器的工作都有滞后特性,所以我们不一定当时就能注意到性能的变化,但是这种影响终究会体现出来。

      <2> 结构的弱点

       (1)作为参数传递的时候效率低

        (2)装箱(Boxing)和解箱(Unboxing)效率低

     <3>  何时使用结构,何时使用类?

    在下面的情况下使用类

      1 内容很多的时候,因为结构总是暗地里拷贝了一个临时变量。
      2 需要非常多内存的时候,因为栈的容量有限,而堆通常是足够使用的。
      3 需要在声明字段的时候进行初始化。
      4 需要从基类继承。
      5 需要多态性。接口也可以用来实现多态性,但是因为结构是值类型,尽管它可以从接口继承,但是在多态过程中会进行装箱和解箱的操作。

    

在下面的情况下使用结构

       1 希望能够象原始类型(比如int,double之类的)一样使用它。比如我们可以声明一个复数结构,然后像double类型一样地使用它。
      2 需要的内存较少,栈可以完全地容纳它。
      3 想避开垃圾收集器的处理,自己掌握资源的释放。
      4 只需要缺省的值,而不需要在声明字段的时候赋值。
      5 不需要从基类继承,当然,不包括ValueType。
      6 不需要多态行为。

      5:给XML文件中已知的结点添加属性:

         XML文件结构如下:

xml version="1.0" encoding="utf-8"?>
<MovieBlacklist>
  
<Blacklist id="17050" part="32" name="江湖俏佳人" age="20" />
  
<Blacklist id="17310" part="1" name="阴谋" />
  
<Blacklist id="17316" part="1" name="WWE摔角080314" />
  
<Blacklist id="17190" part="1" name="2012世界末日" />
MovieBlacklist>

/// 


          
/// 给已知结点增加一个属性
          
/// 

          
/// 
          
/// 
        public void XMLAddAttributes(string XmlPathNode,string sName, string sContent)
          
{
              
// 创建节点
              XmlNode attrCount = objXmlDoc.CreateNode(XmlNodeType.Attribute, sName , null);
              attrCount.Value 
= sContent ;
              
// 添加节点属性
              objXmlDoc.SelectSingleNode(XmlPathNode).Attributes.SetNamedItem(attrCount);
          }


      

6.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
答:
int sum=0;
bool flag=true;
for(int i=1;i<=m;i++)
{
   if(flag)
      sum+=i;
   else
      sum-=i;
   flag=!flag;
}
return sum;

       
      7. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
答:public class MainClass
                  {
                  public static void Main()
                  {
                  Console.WriteLine(Foo(30));
                  }
                  public static int Foo(int i)
                  {
                  if (i <= 0)
                  return 0;
                  else if(i > 0 && i <= 2)
                  return 1;
                  else return Foo(i -1) + Foo(i - 2);
                  }
                  }

      8.在下面的例子里


class Program
    
{
        
static void Main(string[] args)
        
{
            B _b 
= new B();
            Console.ReadKey();
        }

    }

    
class A
    
{
        
public A()
        
{
            PrintFields();
        }

        
public virtual void PrintFields() { }
    }

    
class B : A
    
{
        
int x = 1;
        
int y;
        
public B()
        
{
            y 
= -1;
        }

        
public override void PrintFields()
        
{
            Console.WriteLine(
"x={0},y={1}", x, y);
        }

    }


当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0     9.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

答:short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
         
    10.写出输出结果
          

public abstract class A
    
{
        
public A()
        
{
            Console.WriteLine(
'A');
        }

        
public virtual void Fun()  
       
{
            Console.WriteLine(
"A.Fun()");
        }

    }


    
public class B : A
    
{
        
public B()
        
{
            Console.WriteLine(
'B');
        }


        
public new void Fun()  
       
{
            Console.WriteLine(
"B.Fun()");
        }


        
public static void Main()
        
{
            A a 
= new B();
            a.Fun();
            Console.ReadKey();
        }

    }

A
B
A.Fun()
        第一:调用父类构造函数,第二:调用自身构造函数.

        11.写出输出结果
         

public class A
    
{
        
public virtual void Fun1(int i)
        
{
            Console.WriteLine(i);
        }


        
public void Fun2(A a)
        
{
            a.Fun1(
1);
            Fun1(
5);
        }

    }



    
public class B : A
    
{
        
public override void Fun1(int i)
        
{
            
base.Fun1(i + 1);
        }


        
public static void Main()
        
{
            B b 
= new B();
            A a 
= new A();
            a.Fun2(b);
            b.Fun2(a);
            Console.ReadKey();
        }

    }

   2
    5
    1
    6
 

12:写一个HTML页面,实现以下功能,左键点击页面时显示“您好”,右键点击时显示“禁止右键”。并在2分钟后自动关闭页面。

答:

13:大概描述一下ASP。NET服务器控件的生命周期
答:初始化 加载视图状态 处理回发数据 加载 发送回发更改通知 处理回发事件 预呈现 保存状态 呈现 处置 卸载

14:程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)

要求:  1.要有联动性,老鼠和主人的行为是被动的。

           2.考虑可扩展性,猫的叫声可能引起其他联动效应。


public interface Observer
    
{
        
void Response();    //观察者的响应,如是老鼠见到猫的反映
    }

    
public interface Subject
    
{
        
void AimAt(Observer obs);  //针对哪些观察者,这里指猫的要扑捉的对象---老鼠
    }

    
public class Mouse : Observer
    
{
        
private string name;
        
public Mouse(string name, Subject subj)
        
{           
            
this.name = name;
            subj.AimAt(
this);
        }

        
        
public void Response()
        
{
            Console.WriteLine(name 
+ " attempt to escape!";
        }

    }

    
public class Master : Observer
    
{   
        
public Master(Subject subj)
        
{           
            subj.AimAt(
this);
        }

        
        
public void Response()
        
{
            Console.WriteLine(
"Host waken!";
        }
  
    }

 
    
public class Cat : Subject
    
{
        
private ArrayList observers;
        
public Cat()
        
{   
            
this.observers = new ArrayList();
        }

        
public void AimAt(Observer obs)
        
{
            
this.observers.Add(obs);
        }

        
public void Cry()
        
{
            Console.WriteLine(
"Cat cryed!";
            
foreach (Observer obs in this.observers)
            
{
                obs.Response();
            }

        }

    }

    
class MainClass
    
{       
        
static void Main(string[] args)
        
{
            Cat cat 
= new Cat();
            Mouse mouse1 
= new Mouse("mouse1", cat);
            Mouse mouse2 
= new Mouse("mouse2", cat);
            Master master 
= new Master(cat);
            cat.Cry();
        }

    }


class Program
    
{
        
static void Main(string[] args)
        
{
            Class1 o1 
= new Class1();
            Class1 o2 
= new Class1();
            

        }

    }

    
class Class1
    
{
        
private static int count = 0;
        
static Class1()
        
{
            count
++;
        }

        
public Class1()
        
{
            count
++;
        }

    }

请问,o1.Count的值是多少?( C )
A.1         B.2             C.3             D.4
解答:class1在实例化的时候,先运行静态构造函数,然后运行实例构造函数,第二次实例化的时候,由于静态构造函数已经存在,所有直接实例化,它们都共享静态变量count.

(1)用于对静态字段、只读字段等的初始化。              
(2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。        
(3)类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数
(4)静态构造函数是不可继承的,而且不能被直接调用。            
(5)如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。    
    任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。  

(6)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。