存档

文章标签 ‘C#’

.NET Framework 4.0中的按需构造:Lazy

2010年1月30日

  假设您正在编写一个应用程序,在某些情况下需要使用一个特定对象。此外,假设您需要的对象的创建和使用是非常昂贵的,你不想每次您的应用程序运行时都创建它,只在你需要它的时候才创建它。

  当然你可以自己管理这一切,但 Lazy<T>将使这个任务变得容易。你只需要在那个”昂贵”的对象上创建一个 lazy包装器:

Lazy<ExpensiveResource> ownedResource = new Lazy<ExpensiveResource>();

  然后你可以简单引用 ‘ownedResource.Value’来获取那个”昂贵”的对象。当你第一次访问ownedResource.Value时,这个”昂贵”的资源才会被分配,而不是以前就分配。

  Lazy<T>同时还有一个boolean属性,叫IsValueCreated,你可以检查这个属性来查看值是否已经创建。

  支持没有默认构造函数的类型

  Lazy<T> 不会强制new()约束。你可以在支持不同构造函数,甚至工厂方法实例化的类型上使用Lazy<T>。第二个构造函数指定一个返回新”昂贵”资源的泛型方法:Func<T>:

Lazy ownedResource = new Lazy(    () => new ExpensiveResource("filename.data"));

  你可以使用这个第二个构造函数来更好的控制使用什么样的代码来创建这个”昂贵”的资源。我在这使用了一个不同的构造函数,但你可以使用工厂方法、IOC容器、或其它方法。

  我们生活在多核的世界

   Lazy<T>另有两个其它构造函数:

public Lazy(bool isThreadSafe);
public Lazy(Func<T> valueFactory, bool isThreadSafe);

  这两个构造函数指示出程序运行在多核的环境中。”昂贵”对象延迟(lazy)创建必须进行同步。(毕竟是”昂贵”对象,你不会需要两个这种对象)。

  这是一个简单的类型,但正是这些类型你将一次又一次使用他们。

  首发张文杰的博客:http://zhangwenjie.net (转载请保留,谢谢)。本文地址: http://zhangwenjie.net/archives/263.html

分享家:Addthis中国

Visual Studio , ,

在C#中使用GnuPG加密文件

2010年1月4日

  PGP可以解释为Pretty Good Privacy(汉语翻译:相当好的隐私),是PGP公司的加密和/或签名工具套件,使用了有商业版权的IDEA算法并集成了有商业版权的PGPdisk工具,有别于开源的GPG(GnuPG)。PGP的主要开发者为菲利普·齐默曼(Philip R. Zimmermann)。齐默曼在志愿者的帮助下,突破政府的禁止,于1991年将PGP在因特网上免费发布。

  PGP是一个桌面工具,在程序中使用相当不便。好在我们可以使用开源的GPG(GnuPG)在程序代码中写成文件加密。详见如下代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //EncryptPGP();
            Stopwatch sw = new Stopwatch();
            sw.Start();
            DecryptPGP();
            sw.Stop();
            Console.WriteLine(sw.Elapsed);

            Console.WriteLine("OK");
            Console.Read();
        }
        public static void EncryptPGP()
        {
            ProcessStartInfo pInfo = new ProcessStartInfo();
            pInfo.FileName = @"E:\Test\GnuPGDotNet\GnuPG\gpg.exe";
            pInfo.Arguments = string.Format("  --homedir \"{0}\" --yes --always-trust
             --keyring \"{1}\"  --output \"{2}\" -r zhangwenjie  --encrypt \"{3}\"",
              @"E:\Test\GnuPGDotNet\GnuPG", @"F:\Test\pubring.pkr",
               @"F:\Test\License.txt.pgp", @"F:\Test\License.txt  ");
            pInfo.CreateNoWindow = true;
            pInfo.UseShellExecute = false;

            pInfo.RedirectStandardInput = true;
            pInfo.RedirectStandardOutput = true;
            pInfo.RedirectStandardError = true;
            Process p = Process.Start(pInfo);

            string strInfo;
            while ((strInfo = p.StandardOutput.ReadLine()) != null)
            {
                Console.WriteLine(strInfo);
            }

            p.WaitForExit();

            if (p.ExitCode == 0)
            {
                Console.WriteLine("成功");
            }
            p.Close();

        }
        public static void DecryptPGP()
        {

            ProcessStartInfo pInfo = new ProcessStartInfo();
            pInfo.FileName = @"E:\Test\GnuPGDotNet\GnuPG\gpg.exe";
            pInfo.Arguments = string.Format("  --homedir \"{0}\" --keyring \"{1}\"
           --secret-keyring \"{2}\" --passphrase-fd 0 --output \"{3}\" --decrypt \"{4}\"",
             @"E:\Test\GnuPGDotNet\GnuPG", @"F:\Test\pubring.pkr",
             @"F:\Test\secring.skr", @"F:\Test\Oracle 9i.rar", @"F:\Test\Oracle 9i.rar.pgp");
            pInfo.CreateNoWindow = true;
            pInfo.UseShellExecute = false;
            pInfo.RedirectStandardInput = true;
            pInfo.RedirectStandardOutput = true;
            pInfo.RedirectStandardError = true;
            Process p = Process.Start(pInfo);

            p.StandardInput.WriteLine("123456789");
            p.StandardInput.Flush();
            p.StandardInput.Close();

            string strInfo;
            while ((strInfo = p.StandardOutput.ReadLine()) != null)
            {
                Console.WriteLine(strInfo);
            }

            p.WaitForExit();

            if (p.ExitCode == 0)
            {
                Console.WriteLine("成功");
            }
            p.Close();
        }
    }

}

   其中:pubring.pkr和secring.skr是两个预先生成好的key文件。p.StandardInput.WriteLine(“123456789″);用来输入解密密码的。

  希望本文对希望在C#中使用PGP的朋友的帮助。

  本文首发地址张文杰博客:http://zhangwenjie.net(转载请保留)

分享家:Addthis中国

Windows , , , , ,

微软宣布Visual Studio 2010正式版发布日期

2009年10月19日

早在今年5月份微软就发布了Visual Studio 2010和.NET Framework 4.0的首个Beta测试版,今天微软宣布已经为MSDN订阅用户提供了VS 2010的第二个Beta版,普通用户将在10月21日获取免费下载。

此外,微软还宣布了Visual Studio 2010的官方正式发布日期,定在2010年3月22日,并且表示这将是近几年来Visual Studio和.NET Framework最重要的一次版本升级,新增功能包括Windows 7和SharePoint 2010工具以及对并行编程的支持等。

VS2010开发代号“Rosario”(阿根廷港市罗萨里奥),除了上述功能外还在以下方面进行了改进:

  1. 完善了Visual Studio IDE;
  2. Visual Basic和C#语言:在Visual Studio 2010中,VB和C#语言的演变是对等的,开发人员可以根据自己的爱好选择任意一种语言;
  3. Visual Studio 2010包括一种新的.NET Framework语言:F#;
  4. Web开发:VS 2010改进了代码编写的速度,简化了Web开发,还支持基于MVC的Web应用等;
  5. WPF和Silverlight:改进了对WPF和Silverlight应用程序的开发;
  6. 完善了Visual C++功能。

VS2010的截图如下:

VS2010

Visual Studio 2010外观截图

Visual Studio 2010外观截图

Visual Studio 2010外观截图

官方下载Visual Studio 2010 Beta 1:
http://blogs.msdn.com/onoj/archive/2009/05/19/visual-studio-2010-beta-1-download-options.aspx

分享家:Addthis中国

互联网 , , , , , , , , , ,