C#面试笔试小贴士 2

对于多态,还必需提一个C#中的关键字:new。前面提到,对于virtual方法,JIT会确定实例的实际类型然后决定调用什么方法。但是如果派生类中new关键字修饰方法,则它向CLR澄清此派生类中的方法与基类中的方法毫无关系,以下代码最终调用是基类的introduce方法:


class Program
{
    
static void Main(string[] args)
     {
         Sample1.M1(
new OrdinaryPeople("ZhangSan"));
         Sample1.M1(
new Superman("Hancock"));
         Console.Read();
     }
}

class Sample1
{
    
public static void M1(Person p)
     {
         p.Introdce();
     }
}

class Person
{
    
protected string mName;
    
public Person(string pName)
     {
        
this.mName = pName;
     }

    
public virtual void Introdce()
     {
         Console.WriteLine(
"Hello,I am " + this.mName);
     }
}

class OrdinaryPeople : Person
{
    
public OrdinaryPeople(string pName)
         :
base(pName)
     {
     }

    
public new void Introdce()
     {
         Console.WriteLine(
"Hello,I am an ordinary person," + this.mName);
     }
}

class Superman : Person
{
    
public Superman(string pName)
         :
base(pName)
     {
     }

    
public new void Introdce()
     {
         Console.WriteLine(
"Hi,I am a Superman," + this.mName);
     }
}

ü   操作符重载
对于操作符重载我认为掌握基本的语法即可(况且它们不属于CLS)。以下是Grant Palmer的《C#程序员参考手册上的例子》,实际上演示了复数的加法运算,输出 5-3i


class Program
{
    
static void Main(string[] args)
     {
         Complex a
= new Complex(3, 4);
         Complex b
= new Complex(2, -7);
         Complex c
= a + b;
         Console.WriteLine(c);
         Console.Read();
     }
}

public class Complex
{
    
double a, b;
    
public Complex(double d1, double d2)
     {
        
this.a = d1;
        
this.b = d2;
     }

    
public static Complex operator +(Complex c1, Complex c2)
     {
         Complex c3
= new Complex(c1.a + c2.a, c1.b + c2.b);
        
return c3;
     }

    
public override string ToString()
     {
        
if (b < 0)
         {
            
return a.ToString() + "-" + Math.Abs(b) + "i";
         }
        
else
         {
            
return a.ToString() + "+" + b + "i";
         }
     }
}

 

ü   不安全代码
不安全代码指(显式)使用了指针的代码。注意两个关键字:unsafefixedUnsafe适用于类、结构体、方法、字段、类或结构体的某一代码块。
由于C#中引用类型的对象位于堆上,而堆是由垃圾回收器管理,为避免内存碎片,有时候垃圾回收器需要移动这些对象,如果你显式使用指针访问这些内容,这样就很容易造成无效指针,这时就需要使用fixed关键字,指明保持此对象在堆上的地址是固定的。以下示例中M1方法使用了fixed,因为数组为引用类型(如果不使用,将出现编译错误“只能获取 fixed 语句初始值设定项内的未固定表达式的地址”),而M2方法则无需使用fixed


class Program

{
    
static void Main(string[] args)
     {
        
int[] ar = new int[5] { 1,2,3,4,5};
         M1(ar);
         M2(ar[
0]);
         Console.Read();
     }

    
unsafe static void M1(int[] ar)
     {
        
fixed (int* x = &ar[0])
         {
            
for (int i = 0; i < ar.Length; i++)
             {
                 Console.WriteLine(
*(x + i));
             }
         }
     }

    
unsafe static void M2(int x)
     {
        
int* i = &x;
         Console.WriteLine(
*i);
     }
}

 

ü   访问修饰符
1)对于普通的类来说,仅可以使用publicinternal(类的默认访问修饰符)访问修饰符,嵌套类可以使用publicinternalprotectedprivateprotected interanl
2)成员字段的访问修饰符包括:publicinternalprotectedprotected internalprivate(默认访问修饰符)。其中internal指该成员字段可以被相同程序集中的类访问,internal指该成员字段可以被其派生类访问。Protected internalprotected or internal

 

 

ü   单例模式
单例模式是最简单的一种设计模式,不过在写法上还是有一些细节值得注意的,下面是两个例子:


public sealed class Singleton
{
    
private static Singleton mIns;
    
private static object mLock = new object();
    
private Singleton()
     {
     }

    
public static Singleton GegInstance()
     {
        
lock (mLock)
         {
            
if (mIns == null)
             {
                 mIns
= new Singleton();
             }
            
return mIns;
         }
     }
}

//
public sealed class Singleton
{
    
public static readonly Singleton mIns = new Singleton();
}

 

ü   线程安全
关于线程安全的概念,以ATM机的取款程序来说,假设“用户存款”类中有一个“取款”的方法分为三步:(1)判断余额、(2)调用硬件接口出钞、(3)修改余额。显而易见,在系统对CPU时间片的调度中,中断可能发生在各步骤之间,那么当多线程操作时,很可能造成最终余额不正确。
对于.NET类库中的类与用户定义的类来说,绝大多数的操作与上述的“取款”一样,不是原子操作,因而很可能造成对象最终处于一个不确定的状态。MSDN中对于每一个类,都附带说明其线程安全的的情况(当然,大多数在多线程写的情况下都是不安全的,包括我们常用的集合类、UI控件类等等)。对于这些非线程安全的类来说,只能通过用户在编码的过程中通过同步的机制来确保代码的线程安全。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity是一款广泛使用的游戏开发引擎。它提供了可视化的编辑器界面、底层的渲染引擎以及广泛支持的插件生态系统,使得开发者可以很方便地进行游戏开发。 如果你准备参加Unity的面试笔试,你需要掌握以下方面的知识: 1. 编程语言:Unity支持C#和JavaScript语言。你需要掌握其中一种或两种编程语言,并且能够熟练应用它们。 2. 游戏设计:你需要具备游戏设计的基本知识,包括游戏流程、关卡设计、角色设计、游戏平衡等方面的知识。 3. Unity编辑器:你需要熟练掌握Unity编辑器的各种工具,例如场景编辑、组件列表、资源管理等。 4. 物理引擎:Unity包含了物理引擎,你需要熟悉它的基本概念,例如重力、力、碰撞等。 5. 动画系统:游戏中的角色动画是非常重要的一部分,你需要熟悉Unity的动画系统,包括动画控制器、状态机等。 总之,如果你想要在Unity领域取得成功,你需要在以上方面进行深入学习和掌握。如果你能够在面试笔试中展现出你的知识和技能,相信你会很快获得工作机会。 ### 回答2: Unity是当前市面上非常流行的游戏引擎,而从事Unity开发的人才需求也越来越大。在面试笔试中,可能会涉及到Unity的相关知识和技能。下面将从Unity的四个方面进行简单介绍:游戏物体、组件、Scene和Asset以及C#语言。 1. 游戏物体 在Unity中,物体(GameObject)是游戏场景中的核心对象。而每一个场景都是由若干个物体组成,物体又是由若干个组件(Component)组成的。因此,需要了解游戏物体的各种操作和属性设置,包括名称、激活状态、位置、旋转、缩放、父子关系等。 2. 组件 组件是Unity中最常用的一种对象,也是游戏物体的一个基本组成部分。它可以改变游戏物体的行为、外观和互动方式。在Unity中,可以通过添加或删除组件来更改游戏物体的属性和行为。例如,常用的组件包括:Animator、Rigidbody、Collider等。 3. Scene和Asset Scene(场景)是Unity的一个概念,是由多个游戏物体和它们的组件组成的。在进行游戏开发时,需要了解如何创建、导入和导出Scene。而Asset(资源)则是指Unity中的各种资源文件,例如:纹理、音频、3D模型、动画等。需要了解如何使用Asset Store、如何导入和设置Asset等。 4. C#语言 Unity使用C#语言作为主要的编程语言。因此,在进行Unity开发时,需要了解一些基本的C#语言语法和编程思想,包括:变量、方法、类、继承、多态、接口、委托等。此外,还需要了解一些Unity特有的API和对象模型,例如:GameObject、Component、Transform、Input、Physics等。 总体来说,对于Unity的面试笔试,需要具备扎实的Unity框架和常用组件的运用能力,同时还能够掌握C#语言的基本知识。只有掌握了这些核心技能,才能在Unity开发中不断提升自己,并为团队和项目创造出更多价值。 ### 回答3: Unity 是一款非常流行的游戏开发引擎,其在市场上占有非常重要的地位,因此很多人选择学习和使用 Unity。如何通过 Unity 的面试笔试题来测试候选人的实际技能以及对 Unity 开发的理解和掌握程度呢? 对于 Unity 的面试笔试题,一般会涉及以下几个方面: 1. 编程语言和算法基础 Unity 开发主要使用 C# 语言,因此需要候选人具备扎实的 C# 基础和算法基础,包括数据结构、算法思想、设计模式等方面的知识。 2. Unity 引擎和 API 掌握程度 作为 Unity 开发者,需要掌握很多 Unity 引擎和 API 的知识,比如场景管理、游戏物体与组件、UI 界面开发、动画系统、物理引擎等。针对这些方面,笔试题目可能会让候选人通过代码实现相关功能或者回答相关问题。 3. 项目经验和实践能力 除了理论知识,实际项目经验和实践能力也非常重要。因此,笔试题目可能会涉及到一些实际场景的开发问题,比如优化性能、解决 bug、协作开发等方面。 总之,Unity 面试笔试题主要考察候选人的编程能力、Unity 引擎和 API 掌握程度以及项目实践能力。同时,需要候选人具备良好的沟通能力和团队合作精神,这对于实际开发非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值