蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 673, 评论 - 4345, 引用 - 276

导航

关于

记录自己的技术心得

标签

每月存档

最新留言

  • Hpvjkkxq
    Best Site good looking <a href=" http://www.wikio.com/user/obymyqufoje/bio &quot...
    by Hpvjkkxq(匿名) on 2010/3/20 4:49:35
  • Wkclxeow
    I'm happy very good site <a href=" http://www.wikio.com/user/julyeugos/bio &quot...
    by Wkclxeow(匿名) on 2010/3/20 4:16:36
  • Pwovfgbs
    Thanks funny site <a href=" http://www.wikio.com/user/julyeugos/bio "&g...
    by Pwovfgbs(匿名) on 2010/3/20 3:22:49
  • Kmngdnii
    I love this site <a href=" http://www.wikio.com/user/agiqijeg/bio ">...
    by Kmngdnii(匿名) on 2010/3/20 2:47:46
  • Xktuzzan
    I love this site <a href=" http://www.wikio.com/user/agiqijeg/bio ">...
    by Xktuzzan(匿名) on 2010/3/20 1:52:40
  • Nljddqxy
    perfect design thanks <a href=" http://www.wikio.com/user/lanemuliu/bio "&a...
    by Nljddqxy(匿名) on 2010/3/20 1:17:55
  • Uxknhplj
    real beauty page <a href=" http://www.wikio.com/user/lanemuliu/bio "&gt...
    by Uxknhplj(匿名) on 2010/3/20 0:21:06
  • Ixuckrcn
    Thanks funny site <a href=" http://www.wikio.com/user/edyfiaky/bio "&gt...
    by Ixuckrcn(匿名) on 2010/3/19 23:46:32
  • Huiqpslm
    Very interesting tale <a href=" http://www.wikio.com/user/edyfiaky/bio "&am...
    by Huiqpslm(匿名) on 2010/3/19 22:51:26
  • Yeldiian
    Cool site goodluck :) <a href=" http://www.wikio.com/user/cucygucyqiran/bio &quo...
    by Yeldiian(匿名) on 2010/3/19 22:17:38

广告

【第1页/共2页,11条】
首页
前页
1

使用VS2005的 ClickOnce 技术实现按需下载组件

默认情况下,首次运行 ClickOnce 应用程序时,会下载该应用程序中包含的所有程序集。但是一些特殊的场景我们可能不希望它这么干,而是希望按照一定规测或者需要用到某个组件的时候再下载。

比如我们可能会有下面一些应用场景的需求:

1、我开发的这个客户端程序是要收费的。但是免费用户也可以使用部分功能。我在技术实现上把收费用户使用的功能封装到了A.dll 组件了,我希望免费用户根本无法获得A.dll,只有收费用户才能获得A.dll,并加载A.dll中的收费功能。

2、我整个应用程序非常大,我不希望我每次更新,用户都需要把所有应用程序都下载下来,用户应该只需要下载他用到的功能组件。

 

下面我们就来实现一个简单的按需下载的例子,我们完全可以在这个例子基础上,实现上述提到的应用场景1。

演示步骤:

一、新建一个 类库 Project

定义类库输出应用程序名为:OnDemandAssembly,即这个类库编译后产生的文件名为 OnDemandAssembly.dll

这个类库中有如下代码,我们用这段代码来模拟上面提到场景中的一些需要按需加载的功能或者是收费的功能,我们将在主程序中调用这个功能:

using System;

namespace OnDemandAssembly
{
    public class DynamicClass
    {
        public string Message
        {
            get
            {
                return "郭红俊测试ClickOnce按需加载功能。";
            }
        }

    }
}

 

二、新建一个 Window 应用程序

我们将在这个Window 应用程序中加载上述类库。

 

为了便于我们演示这个程序,请确保这个Window程序具备以下功能:

1、有一个 textbox 控件,这个控件在 Window 的OnLoad 事件中,把应用程序的目录显示在这里,方便我们去监控是否上述 OnDemandAssembly.dll 组件被加载了。

代码如下:

private void Form1_Load(object sender, EventArgs e)
{
    this.textBox1.Text = Application.StartupPath;
}

2、由一个  Button  按钮,点击这个按钮后,我们把 OnDemandAssembly.dll 组件中的 Message 信息显示出来,代码如下:

private void button1_Click(object sender, EventArgs e)
{
    DynamicClass o = new DynamicClass();
    MessageBox.Show(o.Message);
}

 

Window程序关于ClickOnce设置比较特殊的地方:

我们来配置ClickOnce发布的一些特殊参数,确保可以按需下载需要的组件

本文中没有详细描述ClickOnce设置的各个步骤和参数,如果你对ClickOnce不是很熟悉,建议你首先看一些ClickOnce的入门文章再来看本文。

比如:http://blog.oracle.com.cn/155011/viewspace_3603.html 这里提供的ClickOnce 文章(这里是提供了一个word压缩文件下载,文章在压缩的Word文件中)

 

选择我们的Window程序,在右键菜单中选择属性,在属性页中选择发布(Publish)标签页。

然后点击 Application File 按钮,我们来设置,需要发布的文件。如下图:

VS2005发布设置中,选择需要发布那些文件的按钮位置

 

上述按钮打开的窗口如下:

我们在打开的窗口中,设置 OnDemandAssembly.dll 文件的 发布状态为 Include,

并在 Download Group 中为OnDemandAssembly.dll 文件新建的一个下载组,我们这里把这个新的下载组命名为 DemandAssembly01 。

说明:

默认情况下,我们用ClickOnce 第一次安装,或者升级程序的时候,系统只下载 Required 组的文件,其他组的文件系统不下载,需要我们自己编码来下载。

 

 

其他ClickOnce的设置跟我们平常使用的时候一样来设置。本文忽略这部分。

 

我们这时候发布这个程序,我们下载安装后,就会发现OnDemandAssembly.dll 文件不在安装目录下,点击这个程序的按钮,就会报异常,找不到需要的应用程序集

OnDemandAssembly.dll 组件。

 

下面我们来编码实现,如果应用程序找不到 OnDemandAssembly.dll 组件,就从网上下载这个组件的功能

1、窗口的构造函数中增加 AssemblyResolve 事件的处理逻辑

public Form1()
{
    InitializeComponent();

    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{

}

说明:AppDomain.AssemblyResolve 事件 在对程序集的解析失败时发生。

 

2、下面我们编码实现 AssemblyResolve  事件的处理逻辑

using System.Reflection;
using System.Deployment.Application;

// 如果我们有多个文件都需要按需下载的话,每个文件影射到那个下载分组,就是这个实体来记录的

Dictionary<String, String> DllMapping = new Dictionary<String, String>();

public Form1()
{
    InitializeComponent();
    DllMapping["OnDemandAssembly"] = "DemandAssembly01";
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    Assembly newAssembly = null;

    // 是 ClickOnce 部署方式
    if (ApplicationDeployment.IsNetworkDeployed)
    {
        ApplicationDeployment deploy = ApplicationDeployment.CurrentDeployment;

        // Get the DLL name from the Name argument.
        string[] nameParts = args.Name.Split(',');
        string dllName = nameParts[0];
        string downloadGroupName = DllMapping[dllName];

       // 下载所需要的文件 
  try
        {
            deploy.DownloadFileGroup(downloadGroupName);
        }
        catch (DeploymentException de)
        {
            MessageBox.Show("Downloading file group failed. Group name: " + downloadGroupName + "; DLL name: " + args.Name);
            throw (de);
        }

  // 加载组件到应用程序集
        // Load the assembly.
        // Assembly.Load() doesn't work here, as the previous failure to load the assembly
        // is cached by the CLR. LoadFrom() is not recommended. Use LoadFile() instead.
        try
        {
            newAssembly = Assembly.LoadFile(Application.StartupPath + @"\" + dllName + ".dll");
        }
        catch (Exception e)
        {
            throw (e);
        }
    }
    else
    {
        //Major error - not running under ClickOnce, but missing assembly. Don't know how to recover.
        throw (new Exception("Cannot load assemblies dynamically - application is not deployed using ClickOnce."));
    }

    return (newAssembly);
}

 

一些问题说明:

Q:上述代码中,如果我们这个组件OnDemandAssembly.dll 有最新版本了,并且发布了,但是客户端还是一个老的版本的话,这个逻辑我们没有处理呀?

A:问题这个问题,就是代表你对 ClickOnce 的原理还是不懂,OnDemandAssembly.dll 有最新版本,那你就必须再重新发布一个版本的ClickOnce代码,这时候发布的版本号就不一样了。客户端下不同版本号的ClickOnce 程序是存在不同目录下的(当然服务器也是一样)。

系统检查到你的新版本程序发布后,会为新的版本号建立目录,这个目录下如果你没有用过OnDemandAssembly.dll 的功能,是不会有OnDemandAssembly.dll 组件的,继而上述问题是可以不用考虑的。

 

参考资料:

MSDN:Downloading Assemblies On Demand with the ClickOnce Deployment API

posted on 2007-06-14 15:10:00 by ghj1976  评论(7) 阅读(12120)

[收集的资料]VS2005中使用ClickOnce 部署 C# 应用程序

请去如下页面下载这篇文章的压缩文件:

http://blog.oracle.com.cn/155011/viewspace_3603.html

这篇文章是word格式的。

 

posted on 2007-06-14 10:03:00 by ghj1976  评论(1) 阅读(2044)

Orcas Beta1 对多个同名扩展方法的处理逻辑

扩展方法是一个双刃剑,你如果要用扩展方法,就一定得准备碰到别人也用扩展方法,并且万一出现你们都对同一个类进行扩展函数名,参数一样的扩展时候, 会出的各种问题.

 

说明:以下测试是基于Orcas Beta1环境的测试,VS2008 正式版发布后,也许会发生变化。

 

如果你对扩展方法不是很熟悉,建议先看我之前的两篇博客:

C#3.0 中的扩展方法 (Extension Methods)

C#3.0 中使用扩展方法来扩展接口

 

如果我们项目中,在不经意期间,出现了重名的扩展方法,这时候编译器会如何处理呢?这就是本文要探讨的问题。

 

先说结论:编译器按照下述三个优先级顺序去寻找到底哪个方法被调用到:

假设,我们是在A 命名空间下,调用 类 B 的 C 方法。 类的 C 方法可能是在 D 命名空间下使用扩展方法扩展实现的。

 

1、类 B 中是否真实存在 C 方法(非扩展方法),如果存在,则调用之,存在时,不考虑是否有扩展,直接进行调用。(这种情况请看我之前的博客:C#3.0 中的扩展方法 (Extension Methods)

2、命名空间 A ,是否存在对C方法的扩展,如果存在,则调用这种情况下的扩展;看示例代码二

3、调用代码中,除了 命名空间 A,还引用了其他命名空间 D和 F。A命名空间没有对C方法进行扩展,则调用D命名空间下的扩展。

 

特殊情况:

如果 F 和 D 命名空间都对 C 方法进行了扩展,则编译器报错误;看下面的示例代码一

如果 D 和 A命名空间都对 C 方法进行了扩展,则调用 A命名空间下的扩展,编译器不会报错;看示例代码二

 

示例代码一:

以下代码会编译时报错:

The call is ambiguous between the following methods or properties: 'ConsoleApplication1.MyClass01.DO(int)' and 'ConsoleApplication2.MyClass02.DO(int)

表明     using ConsoleApplication2;     using ConsoleApplication1;  导致 ConsoleApplication2 和 ConsoleApplication1  命名空间同级,同级搜索出现重名,报错。

namespace ConsoleApplication2
{
    using System;
    static class MyClass02
    {
        internal static void DO(this int i)
        {
            Console.WriteLine(string.Format("ConsoleApplication2.MyClass02.DO {0}", i));
        }
    }
}

namespace ConsoleApplication1
{
    using System;
    static class MyClass01
    {
        public static void DO(this int i)
        {
            Console.WriteLine(string.Format("HongJunGuo.MyClass01.DO {0}", i));
        }
    }
}

namespace HongJunGuo.Test
{
    using System;
    using ConsoleApplication2;
    using ConsoleApplication1;

    class Program
    {
        static void Main(string[] args)
        {
            int w = 9;
            w.DO();
            Console.ReadLine();
        }
    }
}

示例代码二

以下代码返回的信息为 HongJunGuo.MyClass01.DO 9, 标明优先找 本命名空间下的扩展方法。

namespace ConsoleApplication2
{
    using System;
    static class MyClass02
    {
        internal static void DO(this int i)
        {
            Console.WriteLine(string.Format("ConsoleApplication2.MyClass02.DO {0}", i));
        }
    }
}

namespace HongJunGuo.Test
{
    using System;
    using ConsoleApplication2;

    static class MyClass01
    {
        public static void DO(this int i)
        {
            Console.WriteLine(string.Format("HongJunGuo.MyClass01.DO {0}", i));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int w = 9;
            w.DO();
            Console.ReadLine();
        }
    }
}

特殊情况:如果出现下面的代码:

编译器并不会报错,返回的信息是 ConsoleApplication2.MyClass02.DO , ConsoleApplication2.MyClass02.DO MyObject

原因: 上级命名空间在处理逻辑上跟其他命名空间处理逻辑是一样的.


namespace ConsoleApplication2
{
    using System;
    using HongJunGuo.Test;
    static class MyClass02
    {
        public static void DO(this int i)
        {
            Console.WriteLine(string.Format("ConsoleApplication2.MyClass02.DO {0}", i));
        }

        public static void DO(this MyObject obj)
        {
            Console.WriteLine("ConsoleApplication2.MyClass02.DO MyObject");
        }
    }
}

namespace HongJunGuo
{
    using System;
    using HongJunGuo.Test;
    static class MyClass01
    {
        public static void DO(this int i)
        {
            Console.WriteLine(string.Format("HongJunGuo.MyClass01.DO {0}", i));
        }

        public static void DO(this MyObject obj)
        {
            Console.WriteLine("HongJunGuo.MyClass01.DO MyObject");
        }
    }

}

namespace HongJunGuo.Test
{
    using System;
    using ConsoleApplication2;

    public class MyObject
    {
        public MyObject()
        {

        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int w = 9;
            w.DO();
            MyObject obj = new MyObject();
            obj.DO();

            Console.ReadLine();
        }
    }
}

 

posted on 2007-06-12 18:43:00 by ghj1976  评论(12) 阅读(7013)

C#3.0 中 DLINQ 从数据库获得数据集,XLINQ从XML文件获得数据集的方法

DLINQ和XLINQ的具体查询,更新等操作不是本文讨论重点,本文重点解决如何获取需要查询的数据集。

 

DLINQ 如何链接到数据库?

DLINQ可以访问DataSet,这种情况我们在本文就不考虑了,

本文考虑的是直接用DLINQ访问数据库,我们如果用VS Orcas中的LINQ到SQL的新ORM设计器,VS替我们产生了一些代码,这种情况也不是本文考虑的范围。

本文我们要考虑的事情是:如何自己编码去链接数据库,这样我们才能对DLINQ链接数据库有更深入的了解。

 

下面是一个简单的DLINQ代码:获得 pubs 数据库 authors 表的所有作者的 au_id 信息。

using System;
using System.Linq;
using System.Data.Linq;  // 这个命名空间在单独的组件 System.Data.Linq.dll 中

public class DLinqTest
{
    public static void DoSomeThing()
    {
        // 链接字符串       
        string connectionString = "Data Source=192.168.5.2;Initial Catalog=pubs;Persist Security Info=True;User ID=sa;Password=******";

        // 我们就是通过使用 DataContext  来 DLINQ链接数据库的。
        DataContext db = new DataContext(connectionString);
        Table<Authors> authors = db.GetTable<Authors>();
        var users = from a in authors orderby a.au_id select a;
        foreach (var a in users)
        {
            Console.WriteLine(a.au_id);
        }
    }
}

// 数据库中的表结构影射的实体对象,注意其中的 Attribute.

[Table(Name = "authors")]
public class Authors
{
    [Column(IsPrimaryKey = true)]
    public string au_id { get; set; }
    [Column]
    public string au_lname { get; set; }
    [Column]
    public string au_fname { get; set; }
    [Column]
    public string phone { get; set; }
    [Column]
    public string city { get; set; }
    [Column]
    public string state { get; set; }
    [Column]
    public string zip { get; set; }
    [Column]
    public bool contract { get; set; }
}

DLINQ 链接到数据库的步骤:

1、创建数据表跟实体对应的实体类(字段和元素可以不一一对应),并把这个类标上Table 特性,根数据表字段有关的元素标上Column特性;

2、使用 DataContext 和数据库链接字符串建立跟数据库的链接,然后使用 DataContext  的实例的 GetTable 方法获得对应表影射的实体类。

 

 

XLINQ 访问 XML 文件的方法

 

XLINQ 的例子我们就写稍稍复杂点,通过获得我(蝈蝈俊)博客的RSS,然后把RSS中的链接和标题打印出来:

下面就是这个功能的演示代码:

using System;
using System.Linq;
using System.Xml.Linq;

public class XLINQ
{
    public static void DoSomeThing()
    {
        XElement feed = XElement.Load("http://blog.joycode.com/ghj/Rss.aspx");
        if (feed.Element("channel") == null)
            return;

        var rss = from item in feed.Element("channel").Elements("item")
                  select new
                  {
                      title = item.Element("title").Value,
                      link = item.Element("link").Value
                  };
        foreach (var item in rss)
        {
            Console.WriteLine(item.link);
            Console.WriteLine(item.title);
            Console.WriteLine("*****");
        }
    }
}

XLINQ 加载数据的核心就在于 XElement.Load

另外,上述代码中使用了匿名类型,不知道大家还记不得我前几篇博客设计到的这个知识点。

 

参考资料:

Linq学习笔记(2.1)——初识 DLinq

The LINQ Project

XLinq: Reading RSS and Atom using XLinq

Query Data and Generate an RSS Feed in the same XLinq/DLinq Query!

posted on 2007-06-12 13:33:00 by ghj1976  评论(6) 阅读(6977)

C# 3.0 的Lambda表达式(Lambda Expressions)

Lambda 表达式(拉姆达表达式) 和 匿名方法 其实是一件事情。唯一的不同是:他们语法表现形式不同。Lambda 表达式是在语法方面的更进一步的进化。在本质上,他们是一件事情。他们的作用都是:产生方法。即:内联方法。

引用自 C#首席架构师Anders Hejlsberg 的原话:

http://www.ondotnet.com/pub/a/dotnet/2005/10/31/interview-with-anders-hejlsberg-part-2.html?page=2 

lambda expressions and anonymous methods are really just two words for the same thing. The only thing that differs is, "What does the syntax look like?" And the lambda expressions are a further evolution of the syntax.But underneath, they do the same thing. They generate methods. You know, they're in-line methods.

所以:我们要了解 Lambda 表达式 就应该同时也了解 匿名方法。下面先看一个简单的代码例子,分别用匿名方法和Lambda 表达式来实现对数组的搜索:

 

使用 .net 2.0 的匿名方法来搜索字符串数组中包含 a 的字符串数组

static void Main(string[] args)
{
    string[] list = new string[] { "abc", "12", "java" };
    string[] ll = Array.FindAll(list,
        delegate(string s)
        {
            return s.IndexOf("a") >= 0;
        }
        );
    foreach (string var in ll)
    {
        Console.WriteLine(var);
    }
    Console.ReadLine();
}

使用 .net 3.5 的Lambda表达式来搜索字符串数组中包含 a 的字符串数组

static void Main(string[] args)
{
    string[] list = new string[] { "abc", "12", "java" };

    string[] ll = Array.FindAll(list, s => (s.IndexOf("a") >= 0));
    foreach (string var in ll)
    {
        Console.WriteLine(var);
    }
    Console.ReadLine();
}

从上述两个例子我们可以看出:

从代码书写角度,代码可读性角度来说:Lambda表达式 比匿名方法更简单了。

而 Lambda表达式 和 匿名方法都是干的同一件事情,让我们少写一个函数定义。函数的调用和函数的实现在一起完成了。

 

Lambda表达式的书写格式如下:

(参数列表) => 表达式或者语句块

其中:

参数个数:可以有多个参数,一个参数,或者无参数。

参数类型:可以隐式或者显式定义。

表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。

 

一些Lambda表达式的书写范例:

 

有两个参数的 Lambda表达式例子:

注:别看比较复杂,LINQ中实际把 下述代码中的 delegate ,DoSomeThing 替你做了,所以你写代码的时候只需要写

var t = DoSomeThing<int>(7, 8, (x, y) => x * y); 这么一行。


public delegate T HongJunGuoTest01<T>(T t1, T t2);
class Program
{
    private static T DoSomeThing<T>(T t1,T t2,HongJunGuoTest01<T> match)
    {
        return match(t1, t2);
    }

    static void Main(string[] args)
    {
        var t = DoSomeThing<int>(7, 8, (x, y) => x * y);
        Console.WriteLine(t);
        Console.ReadLine();
    }
}

下面这些写法也是对的(你只需要修改Main函数中的代码,其他地方不需要动):

var t = DoSomeThing<int>(7, 8, (int x, int y) => x * y);

var t = DoSomeThing<string>("7", "8", ( x,  y) => x + y);

或者我们写一个更复杂的: => 右边是一段语句块。

var t = DoSomeThing<int>(7, 8, (x, y) => { if (x < 5) { return (x + 8) * y; } else { return y; } });

 

最前面的例子是一个参数的例子,我们就不举一个参数的例子了,下面举一个没有参数的例子:

public delegate void HongJunGuoTest02();
class Program
{
    private static void DoSomeThing(HongJunGuoTest02 match)
    {
        match();
    }

    static void Main(string[] args)
    {
        DoSomeThing(() => Console.WriteLine("jajaja"));
        Console.ReadLine();
    }
}

函数式编程

匿名方法,Lambda表达式 都是函数式编程思想下的产物,

函数式编程如果从概念角度来理解,比较晦涩,简单来说:

函数式编程的主要特点就是没有变量,所有算法都用递归函数来书写。整个程序除了定义函数就是调用函数,没有其他类型的语句。

这种编程思想的好处和特点,建议参看下面文章:函数式编程另类指南

 

装配脑袋提供的 C#的 Lambda表达式 与 函数式编程的关系说明:

Lambda表达式这个概念本身就是函数式编程的基础。
函数式编程就是基于lambda演算的理论建立起来的。
但C# 3.0 的lambda并不等于lambda演算,自然也无法完全成为函数式编程语言。

参考资料:

Lambda表达式和表达式树(Lambda Expressions and Expression Trees)

C#3.0规范(四)Lambda 表达式

新Orcas语言特性:Lambda表达式

Visual C# 3.0 新特性概览

Linq的超越——强类型反射

Lambda表达式的应用

函数式编程另类指南

已知OO世界中函数式编程实践和小结

C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第三部分

C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码

posted on 2007-06-12 10:14:00 by ghj1976  评论(9) 阅读(8659)

C#3.0 LINQ 查询语法

首先来看一个很简单的LINQ查询例子,查询一个int 数组中小于5的数字,并按照大小顺序排列:

class Program
{
    static void Main(string[] args)
    {
        int[] arr = new int[] { 8, 5, 89, 3, 56, 4, 1, 58 };

        var m = from n in arr where n < 5 orderby n select n;
        foreach (var n in m)
        {
            Console.WriteLine(n);
        }
        Console.ReadLine();
    }
}

上述代码除了LINQ查询语法外,其他都是我们所熟悉的语法,而LINQ查询语法跟SQL查询语法很相识,除了先后顺序。

Q:为何 LINQ 查询语法是以 from 关键字开头的,而不是以 select 关键字开头的?select 开头这种写法跟SQL的写法更接近,更易懂呀?

A:简单来说,为了IDE的智能感知(Intelisence)这个功能,select 关键字放在后面了。

编程语言以 select 开头写LINQ查询语法不是没出现过,你如果使用过2005年的VB9 CTP 版本,那时候VB9的LINQ查询语法就是 select 关键字在前面,但是 select 关键字在前面,在做智能感知(Intelisence)时候就很头大。经过微软IDE组的权衡,确定了把 from 关键字放在最前面。

比如:你看 http://blog.joycode.com/saucer/archive/2005/09/16/63513.aspx 这篇博客,那时候 VB9 LINQ的查询语法还是 select 参数在最前面。不过后来 VB9 测试版改成了跟 C# 一样的做法, from 关键字放在最前面了。

更详细的解释,来自装配脑袋

假设你要书写这样的代码:Select p.Name, p.Age From p In persons Where xxx ,代码是一个个字符输入的。

我们在写到 p in persons 之前,p 的类型是无法推测的,所以写 Select p. 的时候,Name之类的属性不会弹出智能提示来。

这样就需要先去写 From 这句,再回来写 Select。

微软IDE组经过反复考虑决定,还不如就把 Select 写到后面了。于是编程语言中的写法就确定这样来写了。

VB9 的这个变化可以参看这篇博客:

Select/From vs. From/Select revisited...

我们再来看一个稍稍复杂的LINQ查询:

在我们罗列的语言字符串中,我们希望按照字符长短,分类罗列出来,实现代码如下:

static void Main(string[] args)
{
    string [] languages = {"Java","C#","C++","Delphi","VB.net","VC.net","C++ Builder","Kylix","Perl","Python"};

    var query = from item in languages
                orderby item
                group item by item.Length into lengthGroups
                orderby lengthGroups.Key descending
                select lengthGroups;

    foreach (var item in query)
    {
        Console.WriteLine("strings of length {0}",item.Key);
        foreach (var val in item)
        {
            Console.WriteLine(val);
        }
    }
    Console.ReadLine();
}

其中的 into 关键字表示 将前一个查询的结果视为后续查询的生成器,这里是跟 group  by  一起使用的。

LINQ中的Group by不要跟 SQL 中的Group by 混淆,SQL 由于是二维结构,Group by 的一些逻辑受二维结构的约束,无法象 LINQ 中的Group by 这么灵活。

 

参考资料:

LINQ 项目

新Orcas语言特性:查询句法

young18 的LINQ学习笔记系列

posted on 2007-06-07 17:19:00 by ghj1976  评论(8) 阅读(14696)

C#3.0 中对象初始化器(Object Initializers)和集合初始化器(Collection Initializers)

C# 3.0 中对象初始化器(Object Initializers)  和 集合初始化器(Collection Initializers) ,就是简化我们的代码,让本来几行才能写完的代码一行写完。这样在LINQ的使用中,我们才不会把一个LINQ表达式写的巨复杂无比。

 

由于我看到几篇讲 对象初始化器(Object Initializers)和集合初始化器(Collection Initializers) 的文章,都是一个简单的例子,一些稍稍特殊一点的场景的初始化赋值并没有涉及,所以我特整理这篇博客。

 

关于对象初始化器(Object Initializers) 的一些问题:

 

问题一: 对象初始化器允许只给部分值赋值么?即不给其中一些值赋值

答案:允许;参考后面的代码。

问题二:对象初始化器允许给internal 的成员赋值?(私有成员肯定不用想了,肯定不能赋值。)

答案:允许;参考下面的代码。

 

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    private int test01 = 25;
    internal int test02;
}

class Program
{
    static void Main(string[] args)
    {
        Person person = new Person { FirstName = "Scott", LastName = "Guthrie", test02 = 56, };
        Console.WriteLine(person.test02);
        Console.WriteLine(person.Age);
        Console.ReadLine();
    }

}

 

问题三:对象初始化器是否可以结合构造函数一起使用?

答案:可以参看如下代码就可以正常使用:

var cookie3 = new System.Net.Cookie("MyCookie", "Jose") { Comment = "a cookie" };

我们在构造函数中给 Cookie 的名字和值赋了值,在初始化构造器中给 Comment 属性赋了值。

 

问题四:构造函数赋值和初始化构造器赋值那个最先被执行?

比如下述代码,结果是那个呢??

static void Main(string[] args)
{
    var cookie = new System.Net.Cookie("MyCookie", "Jose") { Name = "test02", Comment = "a cookie" };
    Console.WriteLine(cookie.Name);
    Console.ReadLine();
}

答案:

构造函数比初始化构造器更早被执行。

上述WriteLine 写出来的信息为:test02

 

集合初始化器(Collection Initializers) 的一些问题:

 

问题一:集合初始化构造器中是否可以构造集合的一项为空值?

答案:可以,参看下述代码。

 

问题二:集合初始化构造器是否可以初始化Hashtable ?

答案:可以。这时候相当于用了两个对象初始化构造器,参看下面代码:

 

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    private int test01 = 25;
    internal int test02;
}

class Program
{
    static void Main(string[] args)
    {
        List<Person> people = new List<Person>{
            new Person { FirstName = "Scott", LastName = "Guthrie", Age = 32 },
            new Person { FirstName = "Bill", LastName = "Gates", test02 = 85},
            new Person { FirstName = "Susanne", Age = 32 },
            null,
        };

        Hashtable pp = new Hashtable {
            { 1, new Person { FirstName = "Scott", LastName = "Guthrie", Age = 32 } },
            { 2, new Person { FirstName = "Bill", LastName = "Gates", test02 = 85} },
            { 3, new Person { FirstName = "Susanne", Age = 32 } },
            { 4, null },
                       };

        Console.ReadLine();
    }
}

 

 

参考资料:

Orcas中C#语言的新特性:自动属性,对象初始化器,和集合初始化器

C# 3.0 - Object and Collection Initializers

posted on 2007-06-06 16:35:00 by ghj1976  评论(4) 阅读(6536)

C#3.0 中使用扩展方法来扩展接口

有关扩展方法的一些知识点请参看我的前篇博客:C#3.0 中的扩展方法 (Extension Methods)

前篇博客中我重点介绍了两个特殊场景:

1、扩展方法跟原来类的方法重名时候的处理逻辑

2、扩展方法的嵌套

现在我们来看扩展方法使用的第三个场景:使用扩展方法来扩展接口

 

应用场景举例:

我们有时候会发现最初定义的一个接口,在现在环境下,这个接口需要再增加一个函数。有了扩展方法后,我们在这种情况下又多了一种实现的选择。下面以代码来说明这个问题:

namespace Hongjun.Guo
{
    interface MyInterface
    {
        void Test01();
    }

    public class MyClass : MyInterface
    {
        public void Test01()
        {
            Console.WriteLine("Test01");
        }
    }

    static class MyExtensionMethods
    {
        public static void MyTest002(this MyInterface ii)
        {
            ii.Test01();
        }

    }

}

 

调用方法:

using Hongjun.Guo;

static void Main(string[] args)
{
    MyInterface mm = new MyClass();
    mm.MyTest002();
    Console.ReadLine();
}

 

分析这样做的好处:

1、如果我们实现 MyInterface 接口的类很多,这些类没有派生关系,这时候我们要在接口上新增一个函数,按照以前的做法,这个接口的实现类有多少个,我们就需要改多少个,使用了扩展方法后,我们只需要改一个地方。减少代码量。如果实现这个接口的类被封装在不同的组件中,一些组件由于其他原因难以修改,这时候用扩展方法来扩展接口真是给我们一剂良药呀;

2、扩展方法被调用到,前提条件是扩展方法所在的命名空间被使用了。我们如果把接口跟扩展方法放到同一个命名空间,扩展方法需要引用命名空间的问题就可以认为不存在了。因为你要用这个接口,必然会引用这个命名空间。

3、扩展方法扩展的接口,与你自己实现这个接口的类中自己实现的函数重名时候的问题(这时候也可以简单认为是这个类 override 了这个函数实现)。

先说结论:这两个不存在冲突问题,你如果是接口调用,则是扩展方法,如果是实现类调用,则是实现类自己的方法,参看我前面博客对扩展方法跟原来类的方法重名时候的处理逻辑的描述,下面再以一段代码来描述这个问题。

namespace Hongjun.Guo
{
    interface MyInterface
    {
        void Test01();
    }

    static class MyExtensionMethods
    {
        public static void MyTest002(this MyInterface ii)
        {
            ii.Test01();
        }

    }
    public class MyClass : MyInterface
    {
        public void Test01()
        {
            Console.WriteLine("Test01");
        }

        public void MyTest002()
        {
            Console.WriteLine("MyTest002");
        }
    }
}


调用代码:

using Hongjun.Guo;

static void Main(string[] args)
{
    MyInterface mm = new MyClass();
    mm.MyTest002();
    Console.WriteLine("***********");
    ((MyClass)mm).MyTest002();

    Console.ReadLine();
}

这段代码执行的结果是

Test01
***********
MyTest002

分析:

mm.MyTest002(); 这行代码是接口调用,则使用的是扩展方法。

((MyClass)mm).MyTest002();  这行代码调用者类型是MyClass ,MyClass  实现了MyTest002 函数,则不是扩展方法调用。

posted on 2007-06-06 14:32:00 by ghj1976  评论(8) 阅读(6391)

面试题 20070606

1. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
2. 讲一讲你理解的web service,在dot net framework中,怎么很好的结合xml?(讲概念就行了)
3. C#, Java 和 c++的特点,有什么相同的地方,不同的地方,C#分别从c++和java中吸取了他们那些优点?
4. C#可否对内存进行直接的操作?(这可是个难点哦?要注意!)
5. 用Visual C++ 6.0编写的代码(unmanaged code),如何在CLR下和其他dot net component结合?
6. 以前作过的一些项目?介绍一下自己的编程经验。(这是蒙混不过去的,基本一问就知道是真是假)
7. 你对公司有什么期望?你的薪水期望值?为什么学计算机?以前的工作经验(这非常重要)?

Q3: 维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么
Q4:ADO。NET相对于ADO等主要有什么改进?
Q5:ASP。NET与ASP相比,主要有哪些进步?
Q6:C#中的委托是什么?事件是不是一种委托?
Q7:描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
Q8:C#中要使一个类支持FOREACH遍历,实现过程怎样?
Q10:写一个HTML页面,实现以下功能,左键点击页面时显示“您好”,右键点击时显示“禁止右键”。并在2分钟后自动关闭页面。
Q11:你对XMLHTTP、WEBSERVICE 了解吗?简单描述其特点、作用
Q12:接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?
Q13:自定义控件和一般用户控件的异同?如果要用这两者之一,你会选择哪种?为什么
Q14:大概描述一下ASP。NET服务器控件的生命周期
Q15:UML
Q16:面向对象的概念,主要特点
Q17:类划分的依据。类粒度问题
Q18:事物管理问题

第一,谈谈final, finally, finalize的区别。
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
第四,&和&&的区别。
第五,HashMap和Hashtable的区别。
第六,Collection 和 Collections的区别。
第七,什么时候用assert。
第八,GC是什么? 为什么要有GC?
第九,String s = new String("xyz");创建了几个String Object?
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
第十二,sleep() 和 wait() 有什么区别?
第十三,Java有没有goto?
第十四,数组有没有length()这个方法? String有没有length()这个方法?
第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
第十七,给我一个你最常见到的runtime exception。
第十八,error和exception有什么区别?
第十九,List, Set, Map是否继承自Collection接口?
第二十,abstract class和interface有什么区别?
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
第二十三,启动一个线程是用run()还是start()?
第二十四,构造器Constructor是否可被override?
第二十五,是否可以继承String类?
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
第二十八,编程题: 用最有效率的方法算出2乘以8等於几?
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
第三十二,编程题: 写一个Singleton出来。



top1000(天天向上) ( ) 信誉:98 2005-9-14 21:14:28 得分: 0




数据库方面:

1.存储过程和函数的区别
2.事务是什么?
3.游标的作用?如何知道游标已经到了最后?
4.触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。

1。用C#实现以下功能
a 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
b 对上面生成的数组排序,需要支持升序、降序两种顺序
2。请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
3。请说明.net中的错误处理机制,并举例
4。请说出强名的含义
5。请列出c#中几种循环的方法,并指出他们的不同
6。请指出.net中所有类型的基类
7。请指出GAC的含义
8。SQL SREVER中,向一个表中插入了新数据,如何快捷的得到自增量字段的当前值

您在什么情况下会用到虚方法?它与接口有什么不同?
Q:Override与重载有什么区别?
Q:值类型与引用类型有什么区别?
Q:怎样理解静态变量?
Q:向服务器发送请求有几种方式?
Q:DataReader与Dataset有什么区别?
Q:如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理?
Q:用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
Q:软件开发过程一般有几个阶段?每个阶段的作用?
Q:微软推出了一系列的Application Block,请举出您所知道的Application Block并说明其作用?
Q:请列举一些您用到过的设计模式以及在什么情况下使用该模式?
Q:您对WebService的体会?
Q:您对编程的兴趣如何?工作中遇到不懂的问题是怎样去解决的?您一般怎样去提高自己的编程水平?
Q:您离职的原因是什么?
Q:通过超链接怎样传递中文参数?
Q:请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
Q:请编程实现一个冒泡排序算法?

1、override与重载的区别
2、.net的错误处理机制是什么
3、C#中接口和类的异同
4、DataReader和DataSet的异同

1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.
2.如果需记录类的实例个数,该如何实现,请写一个简单的类于以证明.
3.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程.
4.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.

一.填空题
1.c#中的三元运算符是__?:___?
2.当整数a赋值给一个object对象时,整数a将会被__装箱(封装)___?
3.类成员有_____种可访问形式? this.;new Class().Method;
4.public static const int A=1;这段代码有错误么?是什么? const不能用static修饰
5.float f=-123.567F;
int i=(int)f;
i的值现在是_____? 123
6.利用operator声明且仅声明了“==”,有什么错误么?
7.委托声明的关键字是______? delagete
8.用sealed修饰的类有什么特点?密封,不能继承
9.在Asp.net中所有的自定义用户控件都必须继承自________?Control
10.在.Net中所有可序列化的类都被标记为_____?
11.在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?gc
12.下面的代码中有什么错误吗?_______
using System;
class A
{
public virtual void F(){
Console.WriteLine("A.F");
}
}
abstract class B:A
{
public abstract override void F(); // new public abstract void F();
}

13.当类T只声明了私有实例构造函数时,则在T的程序文本外部,___可以___(可以 or 不可以)从T派生出新的类,不可以____(可以 or 不可以)直接创建T的任何实例。
14.下面这段代码有错误么?
switch (i){
case():
CaseZero();
break;
case 1:
CaseOne();
break;
case 2:
dufault; //wrong
CaseTwo();
break;
}
15.在.Net中,类System.Web.UI.Page 可以被继承么?可以

二.简答题
1.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法
4.谈谈类和结构的区别?类是引用类型、结构是值类型
5.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来实现。
6.对于这样的一个枚举类型:
enum Color:byte{
Red,
Green,
Blue,
Orange
}
string[] ss=Enum.GetNames(typeof(Color));
byte[] bb=Enum.GetValues(typeof(Color));
试写一段程序显示出枚举类型中定义的所有符号名称以及它们对应的数值。
7.您了解设计模式么?请列出您所知道的设计模式的名称。 //
8.请在SQL Server中设计表来保存一个树状结构的组织结构图(假设结构图中只有名称这一项内容需要保存),如果我想查询某一职位下的所有职位,用一个存储过程来实现,你有什么思路?
9.什么叫做SQL注入,如何防止?请举例说明。
10.下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
//不相等,因为比较的是对象

1.写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“.”,对其设计测试用 例。
2.对一支纸杯设计测试用例(可以是广义的杯,不一定是某一支特定功能的杯)
开发语言概念题
3.什么是反射?
4.用Singleton如何写设计模式
5.C#中的垃圾回收机制是怎样的?
6.什么是Application Pool?
7.链表和数组的区别,各有什么优缺点.
8.Remoting在客户端服务器怎么实现 ?
9.什么是友元函数?
10.用标准C如何实现多态?
11.什么是虚函数?
12.什么是抽象函数?
13.什么是内存泄漏,怎样最简单的方法判断被存泄漏 ?

英语题
14.用英文介绍一下使用C#/C++做的项目,主要功能
15.如果要与美国开电话会议,会如何与美国的工程师沟通
16.如果老板认为你的技术落后,你会怎么回答

数据库知识题
17.使用什么工具来调用存储过程
18.SQL Server的两种索引是何形式?索引的作用?索引的优缺点?
19.触发器的作用

其它知识题及问题
20.什么是Web Service?
21.什么是XML?
22.Socket怎么实现?




请大家指出我的错误

1. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质

2. 讲一讲你理解的web service,在dot net framework中,怎么很好的结合xml?(讲概念就行了)
不会,正在学习中

3. C#, Java 和 c++的特点,有什么相同的地方,不同的地方,C#分别从c++和java中吸取了他们那些优点?
相同点:都是C系的,都是面向对象
不同点:Java,C#都是建立在虚拟机机制上,而C++不是

4. C#可否对内存进行直接的操作?(这可是个难点哦?要注意!)
可以

5. 用Visual C++ 6.0编写的代码(unmanaged code),如何在CLR下和其他dot net component结合?
编译Dll,[DLLImport]

6. 以前作过的一些项目?介绍一下自己的编程经验。(这是蒙混不过去的,基本一问就知道是真是假)
7. 你对公司有什么期望?你的薪水期望值?为什么学计算机?以前的工作经验(这非常重要)?

Q3: 维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么
触发器,性能好,事务性

Q4:ADO。NET相对于ADO等主要有什么改进?
新增dataset等,不需要随时保持连接,性能提高

Q5:ASP。NET与ASP相比,主要有哪些进步?
asp解释形,aspx编译型,性能提高,有利于保护源码

Q6:C#中的委托是什么?事件是不是一种委托?
委托是一种安全的函数指针,事件是一种消息机制

Q7:描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
不会

Q8:C#中要使一个类支持FOREACH遍历,实现过程怎样?
实现一个接口

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

Q11:你对XMLHTTP、WEBSERVICE 了解吗?简单描述其特点、作用
xmlhttp可以主动获取远端web代码,类似HttpWebRequest

Q12:接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?
接口用于规范,抽象类用于共性。

Q15:UML
统一建模语言

Q16:面向对象的概念,主要特点
封装,基层,多态



数据库方面:

1.存储过程和函数的区别
存储过程是编译好的存储在数据库的操作,函数不用说了。。。

2.事务是什么?
具有原子性特点

3.游标的作用?如何知道游标已经到了最后?
指示当前记录的位置,检查NULL

4.触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。
一个是操作前,一个是操作后

1。用C#实现以下功能
a 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
int[] intArr=new int[100];
ArrayList myList=new ArrayList();
Random rnd=new Random();
while(myList.Count<100)
{
int num=rnd.Next(1,101);
if(!myList.Contains(num))
myList.Add(num);
}
for(int i=0;i<100;i++)
intArr[i]=(int)myList[i];

b 对上面生成的数组排序,需要支持升序、降序两种顺序
ArrayList本身就能排序

2。请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
session(viewstate) 简单,但易丢失
application 全局
cookie 简单,但可能不支持,可能被伪造
input ttype="hidden" 简单,可能被伪造
url参数 简单,显示于地址栏,长度有限
数据库 稳定,安全,但性能相对弱


3。请说明.net中的错误处理机制,并举例
try catch final

4。请说出强名的含义
具有自己的key,可以在GAC为公用

5。请列出c#中几种循环的方法,并指出他们的不同
for wile foreach

6。请指出.net中所有类型的基类
object

7。请指出GAC的含义
全局程序集缓存

8。SQL SREVER中,向一个表中插入了新数据,如何快捷的得到自增量字段的当前值
select @@id... 什么的,忘了

您在什么情况下会用到虚方法?它与接口有什么不同?
前面已说

Q:Override与重载有什么区别?
一个是重写父类函数,一个是同一个函数的几种形式

Q:值类型与引用类型有什么区别?
值和指针的区别

Q:怎样理解静态变量?
所有实例公用一个的变量

Q:向服务器发送请求有几种方式?
get post

Q:DataReader与Dataset有什么区别?
一个是只能向前的只读游标,一个是内存中的表

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

Q:用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
三层,表现,逻辑,数据, 安全性,维护性

Q:软件开发过程一般有几个阶段?每个阶段的作用?
需求分析,架构设计,代码编写,QA,部署

Q:请列举一些您用到过的设计模式以及在什么情况下使用该模式?
著名的singleton


Q:您对编程的兴趣如何?工作中遇到不懂的问题是怎样去解决的?您一般怎样去提高自己的编程水平?
Q:您离职的原因是什么?
Q:通过超链接怎样传递中文参数?
URLEncode URLDecode

Q:请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
foreach

1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.
同一个名称控件直接,或者反射

2.如果需记录类的实例个数,该如何实现,请写一个简单的类于以证明.
const static int classNum=0;
classNum++;

3.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程.
构造先父后子,析够反之

4.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.
string inputStr=" xx xx ";
inputStr=Regex.Replace(inputStr.Trim()," *"," ");

二.简答题
1.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法
using 引入名称空间或者使用非托管资源
new 新建实例或者隐藏父类方法

4.谈谈类和结构的区别?
类是引用类型、结构是值类型

5.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来实现。
和前面那个差不多,一样

6.对于这样的一个枚举类型:
enum Color:byte{
Red,
Green,
Blue,
Orange
}
string[] ss=Enum.GetNames(typeof(Color));
byte[] bb=Enum.GetValues(typeof(Color));
试写一段程序显示出枚举类型中定义的所有符号名称以及它们对应的数值。
foreach

9.什么叫做SQL注入,如何防止?请举例说明。
利用sql关键字对网站进行攻击。过滤关键字'等

10.下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
//不相等,因为比较的是对象

1.写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“.”,对其设计测试用例 。
inputStr=inputStr.ToCharArray().Reverse().ToString();

2.对一支纸杯设计测试用例(可以是广义的杯,不一定是某一支特定功能的杯)
太宽了。。。

开发语言概念题
3.什么是反射?
动态获取程序集信息

4.用Singleton如何写设计模式
static属性里面new ,构造函数private

5.C#中的垃圾回收机制是怎样的?
三个generation,当每个generation内存满了的时候检查引用,无引用就回收内存

6.什么是Application Pool?
Web应用,类似Thread Pool,提高并发性能

7.链表和数组的区别,各有什么优缺点.
一个可以动态增长,一个固定(VB中可以Redim),性能数组教好

8.Remoting在客户端服务器怎么实现 ?
9.什么是友元函数?
friendly声明,可以访问protect级别方法

11.什么是虚函数?
可以被重写

12.什么是抽象函数?
必须被重写

13.什么是内存泄漏,怎样最简单的方法判断被存泄漏 ?
C++,C中忘了释放内存,内存不会再次分配

数据库知识题
17.使用什么工具来调用存储过程
任何一种语言

18.SQL Server的两种索引是何形式?索引的作用?索引的优缺点?
cluster和非cluster,加速查找,占用额外控件,维护索引耗费时间

19.触发器的作用
保证数据库操作变更能接到通知

其它知识题及问题
20.什么是Web Service?
使应用程序在整个网上可以被调用

21.什么是XML?
可扩展标记语言,可以做配置文件,可以传输数据,可以存储数据

22.Socket怎么实现?
这个不知道怎么说了。。。







部分答案:

1. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质

2. 讲一讲你理解的web service,在dot net framework中,怎么很好的结合xml?(讲概念就行了)
不会,正在学习中

3. C#, Java 和 c++的特点,有什么相同的地方,不同的地方,C#分别从c++和java中吸取了他们那些优点?
相同点:都是C系的,都是面向对象
不同点:Java,C#都是建立在虚拟机机制上,而C++不是

4. C#可否对内存进行直接的操作?(这可是个难点哦?要注意!)
可以

5. 用Visual C++ 6.0编写的代码(unmanaged code),如何在CLR下和其他dot net component结合?
编译Dll,[DLLImport]

6. 以前作过的一些项目?介绍一下自己的编程经验。(这是蒙混不过去的,基本一问就知道是真是假)
7. 你对公司有什么期望?你的薪水期望值?为什么学计算机?以前的工作经验(这非常重要)?

Q3: 维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么
触发器,性能好,事务性

Q4:ADO。NET相对于ADO等主要有什么改进?
新增dataset等,不需要随时保持连接,性能提高

Q5:ASP。NET与ASP相比,主要有哪些进步?
asp解释形,aspx编译型,性能提高,有利于保护源码

Q6:C#中的委托是什么?事件是不是一种委托?
委托是一种安全的函数指针,事件是一种消息机制

Q7:描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
不会

Q8:C#中要使一个类支持FOREACH遍历,实现过程怎样?
实现一个接口

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

Q11:你对XMLHTTP、WEBSERVICE 了解吗?简单描述其特点、作用
xmlhttp可以主动获取远端web代码,类似HttpWebRequest

Q12:接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?
接口用于规范,抽象类用于共性。

Q15:UML
统一建模语言

Q16:面向对象的概念,主要特点
封装,基层,多态



数据库方面:

1.存储过程和函数的区别
存储过程是编译好的存储在数据库的操作,函数不用说了。。。

2.事务是什么?
具有原子性特点

3.游标的作用?如何知道游标已经到了最后?
指示当前记录的位置,检查NULL

4.触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。
一个是操作前,一个是操作后

1。用C#实现以下功能
a 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
int[] intArr=new int[100];
ArrayList myList=new ArrayList();
Random rnd=new Random();
while(myList.Count<100)
{
int num=rnd.Next(1,101);
if(!myList.Contains(num))
myList.Add(num);
}
for(int i=0;i<100;i++)
intArr[i]=(int)myList[i];

b 对上面生成的数组排序,需要支持升序、降序两种顺序
ArrayList本身就能排序

2。请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
session(viewstate) 简单,但易丢失
application 全局
cookie 简单,但可能不支持,可能被伪造
input ttype="hidden" 简单,可能被伪造
url参数 简单,显示于地址栏,长度有限
数据库 稳定,安全,但性能相对弱


3。请说明.net中的错误处理机制,并举例
try catch final

4。请说出强名的含义
具有自己的key,可以在GAC为公用

5。请列出c#中几种循环的方法,并指出他们的不同
for wile foreach

6。请指出.net中所有类型的基类
object

7。请指出GAC的含义
全局程序集缓存

8。SQL SREVER中,向一个表中插入了新数据,如何快捷的得到自增量字段的当前值
select @@id... 什么的,忘了

您在什么情况下会用到虚方法?它与接口有什么不同?
前面已说

Q:Override与重载有什么区别?
一个是重写父类函数,一个是同一个函数的几种形式

Q:值类型与引用类型有什么区别?
值和指针的区别

Q:怎样理解静态变量?
所有实例公用一个的变量

Q:向服务器发送请求有几种方式?
get post

Q:DataReader与Dataset有什么区别?
一个是只能向前的只读游标,一个是内存中的表

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

Q:用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
三层,表现,逻辑,数据, 安全性,维护性

Q:软件开发过程一般有几个阶段?每个阶段的作用?
需求分析,架构设计,代码编写,QA,部署

Q:请列举一些您用到过的设计模式以及在什么情况下使用该模式?
著名的singleton


Q:您对编程的兴趣如何?工作中遇到不懂的问题是怎样去解决的?您一般怎样去提高自己的编程水平?
Q:您离职的原因是什么?
Q:通过超链接怎样传递中文参数?
URLEncode URLDecode

Q:请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
foreach

1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.
同一个名称控件直接,或者反射

2.如果需记录类的实例个数,该如何实现,请写一个简单的类于以证明.
const static int classNum=0;
classNum++;

3.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程.
构造先父后子,析够反之

4.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.
string inputStr=" xx xx ";
inputStr=Regex.Replace(inputStr.Trim()," *"," ");





Top
lingfeng0626(网络游侠) ( ) 信誉:78 2006-2-24 14:24:02 得分: 0



二.简答题
1.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法
using 引入名称空间或者使用非托管资源
new 新建实例或者隐藏父类方法

4.谈谈类和结构的区别?
类是引用类型、结构是值类型

5.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来实现。
和前面那个差不多,一样

6.对于这样的一个枚举类型:
enum Color:byte{
Red,
Green,
Blue,
Orange
}
string[] ss=Enum.GetNames(typeof(Color));
byte[] bb=Enum.GetValues(typeof(Color));
试写一段程序显示出枚举类型中定义的所有符号名称以及它们对应的数值。
foreach

9.什么叫做SQL注入,如何防止?请举例说明。
利用sql关键字对网站进行攻击。过滤关键字'等

10.下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
//不相等,因为比较的是对象

1.写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“.”,对其设计测试用例 。
inputStr=inputStr.ToCharArray().Reverse().ToString();

2.对一支纸杯设计测试用例(可以是广义的杯,不一定是某一支特定功能的杯)
太宽了。。。

开发语言概念题
3.什么是反射?
动态获取程序集信息

4.用Singleton如何写设计模式
static属性里面new ,构造函数private

5.C#中的垃圾回收机制是怎样的?
三个generation,当每个generation内存满了的时候检查引用,无引用就回收内存

6.什么是Application Pool?
Web应用,类似Thread Pool,提高并发性能

7.链表和数组的区别,各有什么优缺点.
一个可以动态增长,一个固定(VB中可以Redim),性能数组教好

8.Remoting在客户端服务器怎么实现 ?
9.什么是友元函数?
friendly声明,可以访问protect级别方法

11.什么是虚函数?
可以被重写

12.什么是抽象函数?
必须被重写

13.什么是内存泄漏,怎样最简单的方法判断被存泄漏 ?
C++,C中忘了释放内存,内存不会再次分配

数据库知识题
17.使用什么工具来调用存储过程
任何一种语言

18.SQL Server的两种索引是何形式?索引的作用?索引的优缺点?
cluster和非cluster,加速查找,占用额外控件,维护索引耗费时间

19.触发器的作用
保证数据库操作变更能接到通知

其它知识题及问题
20.什么是Web Service?
使应用程序在整个网上可以被调用

21.什么是XML?
可扩展标记语言,可以做配置文件,可以传输数据,可以存储数据

22.Socket怎么实现?
这个不知道怎么说了。。。



补充中:

1.面向对象的思想主要包括什么?
面向对象三大特征:继承,封套,多态.面相对象的思想也不是一句两句就能说清楚..主要思想就是减少代码重复,增大代码复用率..

2.什么是ASP.net中的用户控件
问这样的问题,一般是迷惑你.因为新手还是分不清楚用户控件和服务器控件(也称自定义控件)..用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类似ASP中的include..但是功能要强大的多..

3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
这个需要当前描述了..东西太多..打字要打死了..找个比较简单的说说吧!
CTS:公共类型系统.主要是为了语言之间的进行标准化处理.
CLS:公共语言规范.主要是确保代码可以在任何语言中访问的最小标准集体
CLR:公共语言运行时.主要是管理代码..处理,加载代码,以及所有服务的代码

4.列举一下你所了解的XML技术及其应用
xml用于配置,用于保存静态数据类型.接触XML最多的是web Services..和config

5.值类型和引用类型的区别?写出C#的样例代码。
值类型是在内存中保存,引用类型是在内存中保存一副本.你在内存中可以有多个某种引用对象..但是值类型始终只有一个.
最常见的值类型就是static,struct;
例如:
static int aa = 1;//值类型
如果多个用户改变aa的值则,aa的值会以最后一个修改的记录为准.其他人的修改则会被冲掉.
引用类型,最能说明问题的就是实例化..你new出来的对象单独分配一个独立的内存..所以值不会互相冲突/
具体的区别参考我的文章:http://lixianhuei.cnblogs.com/archive/2005/08/31/227274.html

6.ADO.net中常用的对象有哪些?分别描述一下。
Connection 数据库连接对象
Command 数据库命令
DataReader 数据读取器
DataSet 数据集

7.如何理解委托?
委托的概念,最好的说明就是事件.因为事件使用的就是委托.例如:this.Load += new System.EventHandler(this.Page_Load);这个就是使用了一个委托.
具体的用法请参考.我以前的帖子,设计猫鼠联动..

8.C#中的接口和类有什么异同。
类是方法功能的实现和集合,接口是规范类.约束类.
参考我的文章:http://lixianhuei.cnblogs.com/archive/2005/08/04/207123.html

9.。net中读写数据库需要用到哪些类?他们的作用
看第六题..答案差不多

10.UDP连接和TCP连接的异同。
这个说不清楚.

11.ASP.net的身份验证方式有哪些?分别是什么原理?
window验证:为每个用户开启window帐号,验证其身份.安全性较高.
forms验证:为每个登陆用户写入一个身份验证票据..在web使用最广的验证方式..灵活方便.

12.进程和线程分别怎么理解?
这个是新人最容易迷惑的东西..
进程:Process

13.什么是code-Behind技术。
新建一个VS.NET下的项目..看到ASPX,RESX和CS三个后缀的文件了吗??这个就是代码分离.实现了HTML代码和服务器代码分离.方便代码编写和整理.

14.活动目录的作用。
活动目录是window2000的最重要的功能.可以将用户信息全部集成起来,登陆以后可以访问多个不同的网络服务..没深入研究过.
查看一下帖子:http://www.ies.impu.edu.cn/resource/os/windowsx/WindowsGeneral/WinGeneral0008.htm

15..net中读写XML的类都归属于哪些命名空间?
System.XML类

16.解释一下UDDI、WSDL的意义及其作用。
解释不清楚了..又是一大块..

17.什么是SOAP,有哪些应用。
simple object access protocal,简单对象接受协议.以xml为基本编码结构,建立在已有通信协议上(如http,不过据说ms在搞最底层的架构在tcp/ip上的soap)的一种规范
是微软大力推广的Web Service使用的协议..

18.如何部署一个ASP.net页面。
不清楚问的什么意思...如果非要回答的话,就写一个带.aspx的后缀文件..然后安装IIS和FrameWork环境..浏览就好了.

19.如何理解.net中的垃圾回收机制。
垃圾回收体制如下:
如果发现内存不够,则垃圾回收器,将全部对象作为无效对象(被回收对象),然后先将全局变量,static,处于活动中的局部变量,以及当前CG指针指向的对象放入一个表中.然后
会搜索新列表中的对象所引用的对象.加入列表中,其他没有被加入列表的对象都会被回收.

20.常用的调用webservice方法有哪些?
我一般用的是WSDL..或者web引用..




呵呵,今天去华为面试了,全是些算法题,而且考的太细致了。人又多,实在没意思,等了会就走了!
现在还记得最后两道:
1。有个字符串,下个函数删除从i开始后j个字符。
c++数据结构解法,一般都是考这些。。。
#include
#include using namespace std;
int main()
{
string myName="shrinerain";
list myList;
list ::iterator curr=myList.begin();
for (int m=0;m
{
myList.insert(curr,myName[m]);
}
int i=5;//第5个开始
int j=3;//删除三个字符
int n=0;
curr=myList.begin();
while (n<=i+j)
{
if (n<=i)
{
curr++;
}
else
{
curr=myList.erase(curr);
}
++n;
}
curr=myList.begin();
while (curr!=myList.end())
{
cout<<*curr;
curr++;
}
cin.get();
return 0;
}

c#解法:
string myName="shrinerain";
int i=5;//第5个开始删除
int j=3;//删除3个
string myName2=myName.Substring(0,i)+myName.Substring(i+j,myName.Length-i-j);
Console.WriteLine(myName2);

2。写个方法判断什么是对称数。比如121,34543,6678766
#include
#include
using namespace std;
int main()
{
string myName="ssass";
stack myStack;
for (int i=0;i
{
if(i
myStack.push(myName[i]);
else
{
if (myName[i]==myStack.top())
{
myStack.pop();
}
}
}
if (myStack.empty())
cout<<"Yes!";
else
cout<<"No!";
cin.get();
return 0;
}

c#版本
string myName="ssahss";
bool flag=true;
int i=0;
while(i
{
string tempStr=myName.Substring(i,myName.Length-2*i);
if(tempStr.Substring(0,1)!=tempStr.Substring(tempStr.Length-1,1))
flag=false;
++i;
}
if(flag==true)
Console.WriteLine("Yes!");
else
Console.WriteLine("No!");

posted on 2007-06-06 12:34:00 by ghj1976  评论(2) 阅读(2226)

C#3.0 中的扩展方法 (Extension Methods)

今天早上在MSDN站点看到这样一篇文章: C# 3.0 LINQ 的演变及其对 C# 设计的影响 。 从这篇文章我们就可以明显的看到,C# 3.0 所新增的这些特性,可以认为都是为了LINQ 的发展,为了LINQ更易用,所创建的一些新特性,当然这些新特性也可以被非LINQ相关功能所使用。LINQ的发展,带动了C#3.0 这一系列新特性的产生。

 

回来说我们的话题,扩展方法,首先看一个最简单的代码例子:

 

扩展方法的定义,需要注意三个部分:1、静态类(私有公共都可以);2、静态方法(私有公共都可以);3、第一个函数参数前带 this(必须是第一参数前)

namespace Hongjun.Guo
{
    static class MyExtensionMethods
    {
        internal static void Print(this object s)
        {
            Console.WriteLine(s);
        }
    }
}

扩展方法的使用,需要注意点: using 你定义所在的命名空间。

using Hongjun.Guo;

static void Main(string[] args)
{
    object o = "dsdgs";
    o.Print();
}

这样一个简简单单的代码后,我们就可以很方便的对一些不开源的第三方控件增加很多我们自己额外需要的功能。 

 

扩展方法的使用,有时候并不是这么简简单单,我们来看一些特殊情况,通过这些特殊情况的分析,我们可以更深入的了解扩展方法:

 

情况一 : 扩展方法跟原来类的方法重名时候的处理逻辑。

场景:我们是对一个第三方的没有开放源代码组件的一个类扩展了一个方法,比如方法: Print 。过了一段时间后,这个第三方的组件发布了新版本,该类的增加了 Print 方法。这时候会出何种效果??

问题演示代码:

namespace Hongjun.Guo
{

    public class MyClass
    {
        public void Print()
        {
            Console.WriteLine("****");
        }
    }

    static class MyExtensionMethods
    {
        internal static void Print(this MyClass s)
        {
            Console.WriteLine("haha " + s.ToString());
        }

    }

}

调用范例:

using Hongjun.Guo;

static void Main(string[] args)
{
    MyClass o = new MyClass();
    o.Print();

    Console.ReadLine();
}

这时候我们会看到何种结果呢??

答案:看到的是 ****

也就是,扩展方法跟类的方法冲突时候,编译使用不会报任何错误,这时候以类的方法优先级最高,这时我们使用类的方法,而不是扩展方法。

 

分析:

我们把上述两组代码编译后,再反编译成IL,我们就可以看到,实际上,扩展方法在IL层上是不存在的。

扩展方法实际是编译器调用某个类的某个方法的时候,先去这个类找,如果有这个方法,则就调用;如果找不到,根据引用的命名空间,再去找扩展方法(静态类的静态方法)。找到,就使用,找不到当然就编译错误了。

根据这个分析结果,我们就可以理解上述问题处理的结果了。

 

情况二: 扩展方法的嵌套

比如我们有如下扩展方法。

namespace Hongjun.Guo
{
    static class MyExtensionMethods
    {
        public static int Test01(this int i)
        {
            return i * 3;
        }

        public static int Test02(this int i)
        {
            return i + 5;
        }
    }
}

下面是调用范例:

static void Main(string[] args)
{
    int mm = 7;
    Console.WriteLine(mm.Test01().Test02());
    Console.WriteLine("*****");
    Console.WriteLine(mm.Test02().Test01());

    Console.WriteLine("*****");

    Console.WriteLine(MyExtensionMethods.Test02(MyExtensionMethods.Test01(mm)));

    Console.ReadLine();
}

 

问,调用的显示结果是何值?

答案: 依次显示: 26,36,26

分析:

mm.Test01().Test02()

这行代码编译后相当于如下代码:

MyExtensionMethods.Test02(MyExtensionMethods.Test01(mm))

这两行代码在编译后的IL中是完全一样的。

 

一些参考资料:

新Orcas语言特性:扩展方法

C# 3.0 LINQ 的演变及其对 C# 设计的影响

C# 3.0 - Extension Methods

Using the New Extension Methods Feature in C# 3.0

C# 3.0 feature 2--Extension methods

posted on 2007-06-06 11:27:00 by ghj1976  评论(18) 阅读(9610)

【第1页/共2页,11条】
首页
前页
1

Powered by: Joycode.MVC引擎 0.5.2.0