今天的面试小记

做程序员以来,一直都是在创业型小公司呆着,手下的程序员最多也就三俩号人,但是老板的各种要求和任务都要快速满足,很多技术还不及深钻就要去赶紧学习其它东西,所以造成了现在技术层面:“广度有,深度无”的尴尬局面,今天去某公司面试了,被问一些我以往工作中没用到(或很少用)的知识点,基本上都是凭经验当场猜的,记在这里备忘:

1、在一个同步的asp.net页面(即常规aspx页面)时,如果一个Button点击去发起一个异步操作,页面会不会有异常?

因为我之前在asp.net页上有试过异步查询,也是类似回调的机制处理,当时页面能正常跑的,没报异常,所以我说不会报异常。

回来后测试了一下:

using System;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        delegate void MyDelegate();
    

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("Button1_Click is called.");
            MyDelegate mydelegate = HelloWorld;
            mydelegate.BeginInvoke(callBack, null);
        }


        void callBack(IAsyncResult ir)
        {
            System.Diagnostics.Debug.WriteLine("callBack is called.");
        }

        void HelloWorld()
        {
            System.Diagnostics.Debug.WriteLine("HelloWorld is called.");
        }
    }
}

确实也没报异常,调试窗口也正常输出了。但是从面试官当时的反应上看,好象对我的回答有些不认同。事后我反思了一下:如果网络问题或其它原因,导致回调超时,也许有可能报异常吧。

马后炮:如果在异步或多线程中,调用其它控件(比如修改界面上TextBox框里的值),不光是APS.NET,WINFORM也会出异常,不过面试当时,没提到是否需要调用其它控件的值,只是问到在同步页面里,发起异步操作,能不能正常跑下去,所以我的回答也不能算错,最多也就是不完备而已

2、ref与"指针的指针":一个类的实例,当成参数传入方法中后,如果在方法中改变了实例的属性,方法调用完成后,该实例的属性最终是否也改变了?

这个问题很基础,就是引用类型与值类型的理解,引用类型的参数传到方法中时,实际上相当于指针,方法调用完成后,当然属性值也变了,这个很easy,99%的程序员就算新手也能回答。

然后面试官接着问:如果在这个引用类型的参数前再加一个ref关键字,结果又是怎样?我的回答,应该还是变了。(后面我回来在vs.net上试了下,我的回答是对的)

using System;

namespace console1
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person() { name = "A" };

            Console.WriteLine("before change,p1.name = {0}", p1.name);

            ChangePersonName(ref p1, "B");

            Console.WriteLine("after change,p1.name = {0}", p1.name);

            Console.Read();

        }

        static void ChangePersonName(ref Person p,string newName) 
        {
            p.name = newName;
        }
    }


    public class Person 
    {
        public string name { set; get; }
    }
}

问题还没结束:如果引用类型的参数,相当于传入的是指针,指针的前面加一个ref,代表什么意思?我的回答:指针的指针。

继续:指针的指针是个什么含义?这时候,方法体内什么事情不能做? 我一时短路,懵了,c语言没学好的遗憾。

3、一个第三方的类(不能修改),但是该类的某个属性的setter方法是private的?有什么方法可以修改这个属性的值?

    public class Person 
    {
        private string _name;

        public string Name 
        {
            get 
            {
                return _name; 
            }

            private set
            {
                _name = value;
            }
        }
    }

 上面是这个类的原型,要求不能修改它,但是必须要求Person类的实例,能修改Name属性值。

第一次遇到这种要求,常规办法肯定是行不通的,看来只能不走寻常路。大脑空白,没想法! 不过回来的路上,我想了想,除了将第三方的dll反编译,得到IL代码(或其它语言的源码),重新编译外,貌似没有其它办法。这个问题也是所有问题中,最让我感到不知所措,最想知道答案的,如果园友有其它高招,跪求指点。

注:好吧,如果面试官换个问法“反射能干些什么”?也许我就不会这么盲然了

我的马后炮答案:

using System;
using System.Reflection;

namespace console1
{
    class Program
    {
        static void Main(string[] args)
        {

            Person p = new Person();           
            PropertyInfo pi = p.GetType().GetProperty("Name");
            pi.SetValue(p, "A",null);
            Console.WriteLine(p.Name);//A
            Console.Read();
        }       
    }

    public class Person 
    {
        private string _name;

        public string Name 
        {
            get 
            {
                return _name; 
            }

            private set
            {
                _name = value;
            }
        }
    }
}

4、一个复杂的sql语句比如: select ... from ... join on ... where ... group by ... order by ... ,数据库内部在执行时,是按什么顺序处理的?

这个基本上也没回答全。 回头得去翻翻SqlServer的相关书籍。

5、在写html代码时,用什么代码可以改变浏览器的解析方式?

这个基本上,也没答上来,以前写css时,只知道<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />这个可以将IE8强制改成兼容视图,但是明显不是面试官要的答案。

马后炮:同样,如果面试官问:DocType的三种类型Strict、Transitional 以及 Frameset,分别有什么不同?我就知道怎么回答了,当时被“解析方式”这一专业词汇给卡住了,导致大脑神游短路。

6、SqlServer的默认系统数据库中model库是干嘛用的?

当时也瞎扯了一通,基本上也没扯全,仍然要去翻翻SqlServer的相关书籍

马后炮:model库是系统数据库之一,是一个模板数据库,每当创建一个新的数据库时,会把model创建一个副本,然后重命名为用户自己定义的数据库名。相当于印刷术中的“字模”

7、二个委托A与B,用Combine操作连接后,赋值给委托C,C指向的是A还是B?

我只知道最终C会执行委托A与委托B中调用的方法,但是最终指向谁?真没想过

马后炮:委托A与委托B的Combine操作,其实考查的是委托链的知识点,多个委托合并后,内部的_invocationList会初始化成一个委托数组,依次存放A与B,然后C指向这个数组,所以该问题中的“指向谁”,如果这个意思的话,应该是指向A(因为A是数组的第一个元素)

8、如果在Asp.Net中开发者即自定义了HttpModule,又定义了HttpHandle,且均在web.config中正确注册了,最后谁会先执行?

我的回答:HttpModule,然后面试官继续问到:如果没有在web.config中注册的HttpModule,如何动态加载? 没答上来

马后炮:当时是凭印象答的,回来验证了一下顺序,没答错,代码如下,但是动态加载httpModule,还是没头绪(尝试在global里捣鼓了下,失败收场,个人感觉多半是要用C#来对IIS进行控制了,继续求达人指点)

MyModule.cs

using System;
using System.Web;

namespace webTest
{
    public class MyModule : IHttpModule
    {
        
        #region IHttpModule Members

        public void Dispose()
        {
           
        }

        public void Init(HttpApplication context)
        {
            System.Diagnostics.Debug.WriteLine("MyModule.Init is called");
            
        }     

        #endregion

    }
}

MyHandler.cs

using System;
using System.Web;

namespace webTest
{
    public class MyHandler : IHttpHandler
    {
        
        #region IHttpHandler Members

        public bool IsReusable
        {
            
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            System.Diagnostics.Debug.WriteLine("MyHandler.ProcessRequest is called");
            
        }

        #endregion
    }
}

然后在web.config中注册

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />

    <httpModules>
      <add name="MyModule" type="webTest.MyModule,webTest"/>
    </httpModules>

    <httpHandlers>
      <add verb="*" path="*.aspx" type="webTest.MyHandler,webTest"/>
    </httpHandlers>
  </system.web>

</configuration>

最终调试窗口的输出:

MyModule.Init is called MyHandler.ProcessRequest is called

更新: 动态加载HttpModule的问题,在微软中文论坛上发贴求助后,很快得到了解答,原来很简单:)

public static ModuleDemo _moduleDemo = new ModuleDemo();

        public override void Init()
        {
            base.Init();
            _moduleDemo.Init(this);
        }

在Global.asax里重载Init事件就ok了

实际工作中,也许可以去查资料,google+百度+msdn,但是面试当场,除了回答yes or no来押宝,基本上没其它招数。不过这也暴露出个人技术层面的很多问题,今后要向除了知识面的广度,更要注重深度的学习。

知之为知之,不知为不知。做技术,来不了虚假,不知道不丢人,丢人的知道了问题所在,还是解决不了,文中提到的问题,欢迎大家回贴指点,本人一定虚心接受:)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏walterlv - 吕毅的博客

C#/.NET 匿名函数会捕获变量,并延长对象的生命周期

发布于 2018-01-05 01:26 更新于 2018-09...

11010
来自专栏Java技术分享

分布式唯一ID生成器Twitter 的 Snowflake idworker java版本

import java.lang.management.ManagementFactory; import java.net.InetAddress; impo...

56490
来自专栏北京马哥教育

两句话掌握 Python 最难知识点:元类

运维行业正在变革,推荐阅读:30万年薪Linux运维工程师成长魔法 千万不要被所谓“元类是99%的python程序员不会用到的特性”这类的说辞吓住。因为每个中国...

346110
来自专栏点滴积累

shapeless官方指南翻译写在前面

目录 前言 Shapeless简介 The Type Astronaut's Guide to Shapeless简介 总结 一、前言        在我的20...

39470
来自专栏工科狗和生物喵

【计算机本科补全计划】指令:计算机的语言(MIPS) --计算机组成原理

正文之前 今天的主题就是,重新学一次汇编语言,不过总感觉跟单片机的汇编语言没啥差别,不过就是地址变宽,然后一些限制多了不少,因为计算机要进行大量的运算,所以更加...

90470
来自专栏哲学驱动设计

EntityFramework 元数据 设计分析

    由于之前已经尝试使用过 EF CodeFirst CTP4,所以这次在EF4.1发布的第三天,在 OEA 框架中已经支持使用它来实现数据访问层。而且,我...

19680
来自专栏Java技术分享

分布式唯一ID生成器Twitter 的 Snowflake idworker java版本

import java.lang.management.ManagementFactory; import java.net.InetAddress; impo...

54650
来自专栏HaHack

Extempore:实时系统的实时编程语言

介绍 Extempore 实时编程语言和环境,并详细探讨了使用 Extempore 演奏音乐的方法和技巧。

23020
来自专栏前端新视界

关于面试题 Array.indexof() 方法的实现及思考

这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了。 昨天看到有网友说面试中也碰到过这个问题,我就重新...

25990
来自专栏Java帮帮-微信公众号-技术文章全总结

02.工厂模式/抽象工厂模式

工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在...

32130

扫码关注云+社区

领取腾讯云代金券