Global.asax的一个相当郁闷的问题

aimeast 2009-02-09 04:30:38
完整的文件如下

<%@ Application Language="C#" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Xml" %>

<script RunAt="server">

void Application_Start(object sender, EventArgs e)
{
//统计初始化
Count_Start();
}

void Application_End(object sender, EventArgs e)
{
Count_SaveCache();
}
void Application_Error(object sender, EventArgs e)
{
//记录出错的请求
Exception LastError = Server.GetLastError();
Count_RecordRequest(LastError.Message);
}
void Application_PostRequestHandlerExecute(object sender, EventArgs e)
{
//记录未出错的请求
Count_RecordRequest(Response.StatusDescription);
}

void Session_Start(object sender, EventArgs e)
{
//记录新的Session
Count_RecordSession();
}

#region 统计的全部实现 Count_Start() Count_RecordSession() Count_RecordRequest(string StatusDescription) Count_Save(string sql) Count_SaveCache()

string ReplaceSingleQuotes(string str)
{
if(string.IsNullOrEmpty(str))
return string.Empty;
else
return str.Replace("'", "''");
}

void Count_Start()
{
XmlDocument xdoc = new XmlDocument();
xdoc.Load(Server.MapPath(@"~/Count.config"));
string ConnStr = xdoc.DocumentElement.SelectSingleNode(@"/Settings/ConnStr").InnerText;
List<String> IngoreList = new List<string>();
foreach(XmlNode node in xdoc.DocumentElement.SelectNodes(@"/Settings/Ingore"))
IngoreList.Add(node.InnerText);
Application["Count_ConnStr"] = ConnStr;
Application["Count_IngoreList"] = IngoreList;
Application["Count_Cache"] = new List<string>();
}

void Count_RecordSession()
{
List<string> Count_Cache = (List<string>)Application["Count_Cache"];
Session["Count_gID"] = Guid.NewGuid().ToString();
string sql = string.Format("INSERT INTO [Count_Session] ([DateTime],[gID],[REMOTE_HOST],[HTTP_ACCEPT_LANGUAGE],[HTTP_USER_AGENT],[HTTP_UA_CPU]) values ('{0}','{1}','{2}','{3}','{4}','{5}')",
DateTime.Now, Session["Count_gID"], Request.ServerVariables["REMOTE_HOST"], ReplaceSingleQuotes(Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"]), ReplaceSingleQuotes(Request.ServerVariables["HTTP_USER_AGENT"]), ReplaceSingleQuotes(Request.ServerVariables["HTTP_UA_CPU"]));
Count_Save(sql);
}

void Count_RecordRequest(string StatusDescription)
{
List<string> Count_Cache = (List<string>)Application["Count_Cache"];
List<string> IngoreList = (List<string>)Application["Count_IngoreList"];
string url = Request.RawUrl;
//ingore some urls
foreach(string str in IngoreList)
if(url.ToLower().IndexOf(str.ToLower()) != -1)
return;
string sql = string.Format("INSERT INTO [Count_Request] ([DateTime],[gID],[RawUrl],[HTTP_REFERER],[QUERY_STRING],[REQUEST_METHOD],[IsSecureConnection],[StatusDescription]) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}')",
DateTime.Now, (HttpContext.Current.Session == null) ? null : Session["Count_gID"], ReplaceSingleQuotes(url), ReplaceSingleQuotes(Request.ServerVariables["HTTP_REFERER"]), ReplaceSingleQuotes(Request.ServerVariables["QUERY_STRING"]), Request.ServerVariables["REQUEST_METHOD"], Request.IsSecureConnection ? 1 : 0, ReplaceSingleQuotes(StatusDescription));
Count_Save(sql);
}

void Count_Save(string sql)
{
List<string> Count_Cache = (List<string>)Application["Count_Cache"];
Application.Lock();
Count_Cache.Add(sql);
if(Count_Cache.Count >= 5)
Count_SaveCache();
Application.UnLock();
}

void Count_SaveCache()
{
try
{
OleDbConnection Count_OleConn = new OleDbConnection((string)Application["Count_ConnStr"]);
Count_OleConn.Open();
List<string> Count_Cache = (List<string>)Application["Count_Cache"];
foreach(string sql in Count_Cache)
{
try
{
OleDbCommand Count_OleCmd = new OleDbCommand(sql, Count_OleConn);
Count_OleCmd.ExecuteNonQuery();
}
catch(Exception ee)
{
Count_SaveException(ee);
}
}
Count_Cache.Clear();
Count_OleConn.Close();
}
catch(Exception ee)
{
Count_SaveException(ee);
}
}

void Count_SaveException(Exception ee)
{
StreamWriter sw = new StreamWriter(Server.MapPath("~/Count_errors.txt"), true);
sw.WriteLine(DateTime.Now);
sw.WriteLine("Message:{0}\n\rStackTrace:{1}", ee.Message, ee.StackTrace);
sw.WriteLine("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
sw.Flush();
sw.Close();
}
#endregion
</script>



问题是

void Count_Save(string sql)
{
List<string> Count_Cache = (List<string>)Application["Count_Cache"];
Application.Lock();
Count_Cache.Add(sql);
//在服务器上
//这里修改成10就怎么都不行
//查找不到任何错误记录
//每次记录数超过10就自动清空了Count_Cache

//在本地修改成10就不会有任何问题。
if(Count_Cache.Count >= 5)
Count_SaveCache();
Application.UnLock();
}


...全文
324 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
aimeast 2009-02-22
  • 打赏
  • 举报
回复
是太难了吗?
还可以以再加分的
aimeast 2009-02-17
  • 打赏
  • 举报
回复
自己顶一下
aimeast 2009-02-14
  • 打赏
  • 举报
回复
怎样才能确定是什么问题导致的服务器重启?
aimeast 2009-02-14
  • 打赏
  • 举报
回复
还有一个疑问,我定义了void Application_End(object sender, EventArgs e)事件,
为什么在服务器重启的时候不会自动保存呢?
jlj84237485 2009-02-14
  • 打赏
  • 举报
回复
帮顶一下
liujiayu10 2009-02-14
  • 打赏
  • 举报
回复
从来不用这个文件
wang520d 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 aimeast 的回复:]
引用 3 楼 wang520d 的回复:
调试的时候用服务器环境。远程调试

只可惜,我那个空间不能远程调试
[/Quote]

上次我也遇到cache在本地可以,在服务器上运行错误;后来重启了下服务器,让服务器重新加载了一下cache后运行正常了;当初我是用cache保存省市区信息;
aimeast 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 qinhl99 的回复:]
本地可以,服务器上不行,那可能是ASP.NET 应用程序的 Global.asax 文件或 Web.config 文件被修改,重新启动了应用程序,所以存储在应用程序状态或会话状态中的所有值都丢失了。另外,某些防病毒软件可能会更新应用程序的 Global.asax 或 Web.config 文件的最后修改日期和时间。
建议你看看是不是这方面的问题,我怀疑你用户的Session可能也会定期丢失的!
[/Quote]
经过认真测试,发现是所有可能导致服务器重启文件的最后修改日期都没有变
但是文件的最后访问日期有变化。


我把整个站点都复制下来,也没有这样的问题。
aimeast 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 qinhl99 的回复:]
本地可以,服务器上不行,那可能是ASP.NET 应用程序的 Global.asax 文件或 Web.config 文件被修改,重新启动了应用程序,所以存储在应用程序状态或会话状态中的所有值都丢失了。另外,某些防病毒软件可能会更新应用程序的 Global.asax 或 Web.config 文件的最后修改日期和时间。
建议你看看是不是这方面的问题,我怀疑你用户的Session可能也会定期丢失的!
[/Quote]
的确,session也是一样的丢失
  • 打赏
  • 举报
回复
呵呵,我没有仔细看你的代码,我只是看到了你的风格,发现比较陈旧(只有在2003、2004年时流行一阵)的风格。

“Count_Cache.Count >= 5”改为“Count_Cache.Count >= 10”现在不会有问题了么?其实我也不知道为什么就没有问题了!我并没有看你的代码。但是可以说,如果你发觉间隔20秒左右就会造成应用重启,那么十有八九仍然说明这段代码有问题,尽管新的代码已经缓解了一部分问题,但是并没有找到问题的根源。你可以把Global.asax中调用此段代码的部分都注释掉,看看还是不是20秒钟就重启应用程序。如果不是,可以一部分一部分地注释这段代码,看看哪些段落造成问题。
vlysses 2009-02-12
  • 打赏
  • 举报
回复
按我说的方法改了吗?Server.MapPath("~/Count_errors.txt")里有错误描述吗?贴出来。
qinhl99 2009-02-12
  • 打赏
  • 举报
回复
本地可以,服务器上不行,那可能是ASP.NET 应用程序的 Global.asax 文件或 Web.config 文件被修改,重新启动了应用程序,所以存储在应用程序状态或会话状态中的所有值都丢失了。另外,某些防病毒软件可能会更新应用程序的 Global.asax 或 Web.config 文件的最后修改日期和时间。
建议你看看是不是这方面的问题,我怀疑你用户的Session可能也会定期丢失的!
pdsnet 2009-02-12
  • 打赏
  • 举报
回复
学习~`
aimeast 2009-02-12
  • 打赏
  • 举报
回复
现在专门写了一个页面放到服务器上试验,在global.asax里面定义了一个List<string>的变量。
如果连续刷新本页面没有任何问题,但要是间隔20秒左右刷新,就会丢失List<string>里面的数据。

在本地怎么测试都不会有问题。
using System;
using System.Collections.Generic;

public partial class Count_test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Session.Timeout = 100;
Response.Write(Session.Timeout);
Response.Write("<br>");
List<string> list = ASP.global_asax.Count_Test;
list.Add(Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString());
Response.Write(list.Count.ToString() + "<br>");
foreach(string item in list)
{
Response.Write(item + "<br>");
}
GC.Collect();
}
}
aimeast 2009-02-12
  • 打赏
  • 举报
回复
使用了静态变量,还是同样的问题
bj890 2009-02-12
  • 打赏
  • 举报
回复
up
aimeast 2009-02-12
  • 打赏
  • 举报
回复
如果有信息要从一个页面传递到另外一个页面,用static怎么实现?
aimeast 2009-02-12
  • 打赏
  • 举报
回复
也可以lock(this)吧?
aimeast 2009-02-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sp1234 的回复:]
其实使用正规的多线程的lock(此时并不专门考虑用在asp.net环境),相比使用Application集合的lock机制来说,要更通用,遇到更容易解决。
[/Quote]
就是说这样使用就可以吧!
static List<int> a=new List<int>;
void todo(){
lock(a)
a.Add(10);
}
  • 打赏
  • 举报
回复
其实使用正规的多线程的lock(此时并不专门考虑用在asp.net环境),相比使用Application集合的lock机制来说,要更通用,遇到更容易解决。
加载更多回复(14)
【面试题库网整理 .net 面试题(附答案)(四)】 7. 某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密码单词必须遵循如下规则: (1) 密码单词的最小长度是两个字母,可以相同,也可以不同 (2) K不可能是单词的第一个字母 (3) 如果L出现,则出现次数不止一次 (4) M不能使最后一个也不能是倒数第二个字母 (5) K出现,则N就一定出现 (6) O如果是最后一个字母,则L一定出现 问题一:下列哪一个字母可以放在LO中的O后面,形成一个3个字母的密码单词? A) K B)L C) M D) N 答案:B 问题二:如果能得到的字母是K、L、M,那么能够形成的两个字母长的密码单词的总数是多少? A)1个 B)3个 C)6个 D)9个 答案:A 问题三:下列哪一个是单词密码? A) KLLN B) LOML C) MLLO D)NMKO 答案:C 8. 62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等式成立,如何移动? 答案:62移动成2的6次方 new有几种用法 第一种:new Class(); 第二种:覆盖方法 public new XXXX(){} 第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。 2.如何把一个array复制到arrayList里 foreach( object o in array )arrayList.Add(o); 3.datagrid.datasouse可以连接什么数据源 [dataset,datatable,dataview] dataset,datatable,dataview , IList 4.概述反射和序列化 反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性 序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。 5.概述o/r mapping 的原理 利用反射,配置 将类于数据库表映射 7.用sealed修饰的类有什么特点 sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其它类的基类,则会发生编译时错误。 密封类不能同时为抽象类。 sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。 11.详述.NET里class和struct的异同! class:放在 ? struct放在? struct值传递 类与结构有很多相似之处:结构可以实现接口,并且可以具有与类相同的成员类型。然而,结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承。结构的值存储在“在堆栈上”或“内联”。细心的程序员有时可以通过聪明地使用结构来增强性能。 12.概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。 远程逻辑调用,remoing接口只能用在.net中 13.什么是code-behind技术 aspx and cs 14.概述三层结构体系 web/business/dataaccess 15.asp.net如何实现MVC模式,举例说明! web/business/dataaccess 2.什么是ASP.net中的用户控件 答:用户控件就是.ascx扩展名的东西喽,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做成用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整. 3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释? 答:装箱就是把值类型转成引用类型,从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚. 4.列举一下你所了解的XML技术及其应用 答:XML可是好东西,保存配置,站与站之间的交流,WEB SERVICE都要用它. 5.值类型和引用类型的区别?写出C#的样例代码。 答:结构是值类型,类是引用类型,所以传结构就是值类型的应用啦,传对象或类就是引用类型的,这个不用多写了吧. 6.ADO.net中常用的对象有哪些?分别描述一下。 答:connection command sqladapter dataset datatable dataview等等.写不完了. 7.如何理解委托? 答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法. msdn2005中是这样解释的: 委托具有以下特点: 委托类似于 C++ 函数指针,但它是类型安全的。 委托允许将方法作为参数进行传递。 委托可用于定义回调方法。 委托可以链接在一起;例如,可以对一个事件调用多个方法。 方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。 C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。 【面试题库网整理 .net 面试题(附答案)(三)】 22.您要创建一个显示公司员工列表的应用程序。您使用一个DataGrid控件显示员工的列表。您打算修改这个控件以便在这个Grid的Footer显示员工合计数。请问您应该怎么做?( C? ) A.重写OnPreRender事件,当Grid的Footer行被创建时显示合计数。 B.重写OnItemCreated事件,当Grid的Footer行被创建时显示合计数。 C.重写OnItemDataBound事件,当Grid的Footer行被创建时显示合计数。 D. 重写OnLayout事件,当Grid的Footer行被创建时显示合计数。 23.您要创建ASP.NET应用程序用于运行AllWin公司内部的Web站点,这个应用程序包含了50个页面。您想要配置这个应用程序以便当发生一个HTTP代码错误时它可以显示一个自定义的错误页面给用户。您想要花最小的代价完成这些目标,您应该怎么做?(多选)( CD )   A.在这个应用程序的Global.asax文件中创建一个Application_Error过程去处理ASP.NET代码错误。   B.在这个应用程序的Web.config文件中创建一个applicationError节去处理ASP.NET代码错误。   C.在这个应用程序的Global.asax文件中创建一个CustomErrors事件去处理HTTP错误。   D.在这个应用程序的Web.config文件中创建一个CustomErrors节去处理HTTP错误。   E.在这个应用程序的每一页中添加一个Page指示符去处理ASP.NET 代码错误。   F. 在这个应用程序的每一页中添加一个Page指示符去处理ASP.NET HTTP错误。 24.您的公司有一个DB Server,名为AllWin,其上装了MS SQLSERVER 2000。现在需要您写一个数据库连接字符串,用以连接AllWin上SQL SERVER中的一个名为PubBase实例的Test库。请问,应该选择下面哪一个字符串?( B )   A. “Server=AllWin;Data Source=PubBase;Initial Catalog=Test;Integrated Security=SSPI”   B. “Server= AllWin;Data Source=PubBase;Database=Test;Integrated Security= SSPI”   C. “Data Source= AllWin \PubBase;Initial Category=PubBase;Integrated Security= SSPI”   D. “Data Source= AllWin \ PubBase;Database=Test;Integrated Security= SSPI” 25.您为AllWin公司创建了一个ASP.NET应用程序。这个应用程序调用一个 Xml Web Service。这个 Xml Web Service 将返回一个包含了公司雇员列表的DataSet对象。请问您该如何在这个程序中使用这个 Xml Web Service?( ? )   A.在“引用”对话框的.Net标签中选择 System.Web.Services.dll。   B.在“Web引用”对话框中输入这个 XML Web service 的地址。   C.在您的 Global.asax.cs 中添加一条 using 语句并指定这个 XML Web service 的地址。   D.在您的 Global.asax.cs 中写一个事件处理器导入这个 Xml Web Service 相应的 .wsdl 和 .disco 文件。 26.您要创建一个ASP.NET应用程序在DataGrid控件中显示一个经过排序的列表。产品数据被存放于一个名为PubBase的Microsoft SQL Server 数据库。每个产品的主键是ProductID,Numeric型并且每个产品有一个字母描述字段,名为ProductName。您使用一个SqlDataAdapter对象和一个SqlCommand对象通过调用一个存储过程从数据库中获取产品数据。您将SqlCommand对象的CommandType属性设置为CommandType.StoredProcedure,并将它的CommandText属性设置为procProductList。您成功的获取了一个DataTable对象,其中是已经按ProductID降序排列的产品列表。您打算显示以相反的字母顺序排列的ProductName,请问该怎么做? ( B )   A. 将SqlCommand对象的CommandType属性修改为CommandType.Text,将CommandText属性修改为”SELECT * FROM procProductList ORDER BY ProductName DESC”。然后将这个DataTable对象绑定到DataGrid控件。   B. 创建一个基于这个DataTable对象的新的DataView并将这个DataView的Sort属性设置为“ProductName DESC”。然后将这个DataView对象绑定到DataGrid控件。   C. 将DataGrid控件的AllowSorting属性设置为True,并将DataGridColumn的SortExpression属性设置为 “ProductName DESC”.以显示ProductName。然后将这个DataTable对象绑定到DataGrid控件。   D. 将DataTable对象的DisplayExpression属性设置为 “ORDER BY ProductName DESC”.。然后将这个DataTable对象绑定到DataGrid控件。 76.C#代码实现,确保windows程序只有一个实例(instance) /// ///应用程序的主入口点。 /// [STAThread] staticvoid Main() { //防止程序多次运行 if(!OneInstance.IsFirst("GetPayInfo")) { MessageBox.Show ("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!","程序错误提示:",MessageBoxButtons.OK,MessageBoxIcon.Stop); return; } Application.Run(new Form1()); } // ******************* 防止程序多次执行 ************************** publicabstractclass OneInstance { /// ///判断程序是否正在运行 /// ///程序名称 ///如果程序是第一次运行返回True,否则返回False publicstaticbool IsFirst(string appId) { bool ret=false; if(OpenMutex(0x1F0001,0,appId)==IntPtr.Zero) { CreateMutex(IntPtr.Zero,0,appId); ret=true; } return ret; } [DllImport("Kernel32.dll",CharSet=CharSet.Auto)] privatestaticextern IntPtr OpenMutex( uint dwDesiredAccess, // access int bInheritHandle, // inheritance option string lpName // object name ); [DllImport("Kernel32.dll",CharSet=CharSet.Auto)] privatestaticextern IntPtr CreateMutex( IntPtr lpMutexAttributes, // SD int bInitialOwner, // initial owner string lpName // object name ); } 【面试题库网整理 .net 面试题(附答案)(二)】 8.以下代码段中能否编译通过?请给出理由。 try { } catch(FileNotFoundException e1) { } catch(Exception e2) { } catch(IOException e3) { } catch { } 9.对于一个实现了IDisposable接口的类,以下哪些项可以执行与释放或重置非托管资源相关的应用程序定义的任务?(多选) ( ABC ) A.Close B.DisposeC.Finalize D.using E.Quit 10.Net依赖以下哪项技术实现跨语言互用性?( C ) A.CLR B.CTS C.CLS D.CTT 11.请问: String类与StringBuilder类有什么区别?为什么在.Net类库中要同时存在这2个类?(简答) 如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的。 12.以下哪个类是int的基类?( ) A.Int32 B.Object C.ValueType D.Int16 二、C# 部分* 13.以下哪些可以作为接口成员? (多选) ( ABDE ) A.方法B.属性C.字段D.事件E.索引器 F.构造函数G.析构函数 14.以下关于ref和out的描述哪些项是正确的?(多选) ( ACD ) A.使用ref参数,传递到ref参数的参数必须最先初始化。 B.使用out参数,传递到out参数的参数必须最先初始化。 C.使用ref参数,必须将参数作为ref参数显式传递到方法。 D.使用out参数,必须将参数作为out参数显式传递到方法。 15.“访问范围限定于此程序或那些由它所属的类派生的类型”是对以下哪个成员可访问性含义的正确描述?( B ) A.public B.protected C.internal D.protected internal 16.class Class1 { private static int count = 0; static Class1() { count++; } public Class1() { count++; } } Class1 o1 = new Class1(); Class1 o2 = new Class1(); 请问,o1.Count的值是多少?( C ) A.1 B.2 C.3 D.4 17.abstract class BaseClass { public virtual void MethodA() { } public virtual void MethodB() { } } class Class1: BaseClass { public void MethodA(string arg) { } public override void MethodB() { } } class Class2: Class1 { new public void MethodB() { } } class MainClass { public static void Main(string[] args) { Class2 o = new Class2(); Console.WriteLine(o.MethodA()); } } 请问,o.MethodA调用的是: ( A ) A.BaseClass.MethodAB.Class2.MethodA C.Class1.MethodAD.都不是 【.net 面试题系列文章一(附答案)】 1 (1)面向对象的语言具有__继承性_性、_封装性_性、_多态性 性。 (2)能用foreach遍历访问的对象需要实现 _ IEnumerable 接口或声明_ GetEnumerator 方法的类型。1.c#中的三元运算符是__?:__ 2.当整数a赋值给一个object对象时,整数a将会被__装箱___? 3.类成员有__3__种可访问形式? 4.public static const int A=1;这段代码有错误么?是什么? const成员都是static所以应该去掉static 5.float f=-123.567F; int i=(int)f; i的值现在是_-123____? 6.利用operator声明且仅声明了==,有什么错误么? 要同时修改Equale和GetHash() ? 重载了"==" 就必须重载 "!=" 7.委托声明的关键字是___ delegate ___? 8.用sealed修饰的类有什么特点?不可被继承 9.在Asp.net中所有的自定义用户控件都必须继承自_ System.Web.UI.UserControl _______? 10.在.Net中所有可序列化的类都被标记为__[serializable]___? 11.在.Net托管代码中我们不用担心内存漏洞,这是因为有了_ gC __? 12.下面的代码中有什么错误吗?_ abstract override 是不可以一起修饰______ using System; class A { public virtual void F(){ Console.WriteLine("A.F"); } } abstract class B:A { public abstract override void F(); } 13.当类T只声明了私有实例构造函数时,则在T的程序文本外部,_不可以_(可以 or 不可以)从T派生出新的类,_不可以_(可以 or 不可以)直接创建T的任何实例。 14.下面这段代码有错误么?case():不行 default; switch (i){ case(): CaseZero(); break; case 1: CaseOne(); break; case 2: dufault; CaseTwo(); break; } 15.在.Net中,类System.Web.UI.Page 可以被继承么?可以

62,050

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧