One World One Dream

Love and Peace

2009-10-02

using 语句(C# 参考)

提供能确保正确使用 IDisposable 对象的方便语法。




就拿你这段代码来说



using(OleDbConnection connection = new OleDbConnection(connectionString))

{

connection.Open();

//一段代码

}



可以看到,在代码中,只打开了数据库连接,而没有调用connection.Close()

但是因为 using 会确保正确使用 IDisposable,那么,在跳出using的时候,connection.Dispose() 就会被正确的调用,所以可以不用调用connection.Close()。





另一种情况,就是异常,using也能保证确保正确使用 IDisposable。





using(OleDbConnection connection = new OleDbConnection(connectionString))

{

connection.Open();

//在下面的代码里,出现了异常,

}



在这种情况下,using也能保证connection以被正确的释放。







按照规则,当使用 IDisposable 对象时,应在 using 语句中声明和实例化此对象。using 语句按照正确的方式调用对象上的 Dispose 方法,并(在您按照前面所示方式使用它时)会导致在调用 Dispose 时对象自身处于范围之外。在 using 块中,对象是只读的并且无法进行修改或重新分配。



using 语句确保调用 Dispose,即使在调用对象上的方法时发生异常也是如此。通过将对象放入 try 块中,并在调用 finally 块中的 Dispose,可以获得相同的结果;实际上,这就是编译器转换 using 语句的方式。



可以将多个对象与 using 语句一起使用,但必须在 using 语句中声明这些对象,如以下示例所示:



using (Font font3 = new Font("Arial", 10.0f),

font4 = new Font("Arial", 10.0f))

{

// Use font3 and font4.

}



可以实例化资源对象,然后将变量传递给 using 语句,但这不是最佳做法。在这种情况下,该对象将在控制权离开 using 块之后保持在范围内,即使它可能将不再具有对其非托管资源的访问权也是如此。换句话说,再也不能完全初始化该对象。如果试图在 using 块外部使用该对象,则可能导致引发异常。由于这个原因,通常最好是在 using 语句中实例化该对象并将其范围限制在 using 块中。



Font font2 = new Font("Arial", 10.0f);

using (font2) // not recommended

{

// use font2

}

// font2 is still in scope

// but the method call throws an exception

float f = font2.GetHeight();



参考资料:MSDN

标签:

SetCompatibleTextRenderingDefault &GetManifestResourceStream

http://msdn.microsoft.com/zh-cn/library/system.windows.forms.application.setcompatibletextrenderingdefault(VS.80).aspx

http://msdn.microsoft.com/zh-cn/library/xc4235zt.aspx

标签:

C#中的属性

原著:Sadaf Alvi



翻译:Abbey


原文出处 Attributes in C#, CodeProject



摘要

  在这篇指南里,我们将会看到如何自己创建属性(Attribute),并将其用到不同的程序实体(Entity)上,在程序运行时获取属性信息。



译注

  MSDN将 Attribute 与 Property 均译作“属性”。我真不知道该怎么译了,就将 Property 译作“数据属性”吧。



介绍

  属性(Attribute)是一种新型的声明信息。我们可以使用属性来定义设计时的信息(比如帮助文件、文档的链接),以及运行时的信息(比如将一个类的域与一个XML的域相关联)。我们也可以用属性来创建“自描述”的组件(可以提供该组件的描述信息)。在这篇指南里,我们将会看到如何自己创建属性(Attribute),并将其用到不同的程序实体(Entity)上,并在程序运行时获取属性信息。



属性的概念

  MSDN(ms-help://MS.MSDNQTR.2002APR.1033/csspec/html/vclrfcsharpspec_17_2.htm)里是这样定义的:属性是一个声明的附加声明。



使用预定义的属性

  C#已经预定义了一小组的属性供我们使用。在学习如何创建一个自定义的属性前,我们先通过一段代码来看看怎么使用这些预定义的属性吧。



using System;

public class AnyClass

{

[Obsolete("别用Old这个老方法了,请用New方法", true)]

static void Old( ) { }



static void New( ) { }



public static void Main( )

{

Old( );

}

}

  在这个例子里我们使用了Obsolete(“陈旧的”)属性,它会将其所修饰的程序实体(类、方法、数据成员等)说明为已废弃不用的。第一个参数—一个字符串说明这个实体为何被废弃、由谁代替。实际上这个字符串的内容你想写什么都可以。第二个参数则告诉编译器将用户对此实体的调用视作一个编译错误。这个参数的缺省值为false,表示编译器仅将用户对其的调用视作警告。编译上面这段代码时,我们将会得到一个编译错误(译注:注意编译错误后附的提示了吗?): AnyClass.Old() is obsolete:“别用Old这个老方法了,请用New方法”

开发自定义的属性

  现在开始开发我们自己的属性吧。这儿有一个小窍门:从C#定义的System.Attribute类派生我们的属性类(从抽象基类System.Attribute直接或间接地派生一个类,该派生类都是一个属性类。一个属性类的声明就定义了一种新的属性类型),然后得到了这样一个声明: using System;

public class HelpAttribute : Attribute

{

}

不管你相不相信,我们已经创建了一个自定义的属性。我们可以象这样用它修饰任何的类: [Help()]

public class AnyClass

{

}

注意:

  在属性类名与后缀Attribute间存在一个自动的编译转换。因此当我们用一个属性去修饰一个程序实体时,不需要给出Attribute这个后缀。编译器首先会在System.Attribute的所有派生类中进行匹配,如果没有找到匹配属性,它就将属性名加上Attribute后缀名后再进行匹配。  

  目前我们的这个属性还没什么用,让我们加点内容吧。在这个示例里,我们为自定义的属性类添加了一个数据属性Description(Property),我们将在本文的最后演示如何在运行时查询这些信息。 using System;

public class HelpAttribute : Attribute

{

public HelpAttribute(String Descrition_in)

{

this.description = Description_in;

}

protected String description;

public String Description

{

get

{

return this.description;



}

}

}





[Help("这是个什么也不做的类")]

public class AnyClass

{

}

定义/控制自定义属性的使用

  AttributeUsage 类是另一个预定义的属性类,以帮助我们控制自定义属性的使用。亦即我们可以定义自定义属性类的属性。这个类描述了如何使用自定义的属性类。AttributeUsage有三个数据属性可用以修饰我们的自定义的属性:

 ValidOn

定义了自定义属性在哪些程序实体上可被使用。这个可使用实体的列表可通过AttributeTargets枚举类型的OR操作进行设置

AllowMultiple 定义了是否可在同一个程序实体上同时使用多个属性进行修饰

Inherited 定义了自定义属性的修饰是否可由被修饰类的派生类继承



  让我们做点具体的吧。我们将会用一个AttributeUsage属性修饰我们的属性类,以控制其作用范围:

using System;

[AttributeUsage(AttributeTargets.Class), AllowMultiple = false, Inherited = false ]

public class HelpAttribute : Attribute

{

public HelpAttribute(String Description_in)

{

this.description = Description_in;

}

protected String description;

public String Description

{

get

{

return this.description;

}

}

}

  先看看AttributeTargets.Class,说明了我们的Help属性只能用以修饰类,下面的这段代码将会导致一个编译错误(“属性Help不能用在这样的声明上,它只能用在类的声明上”),因为我们用Help属性去修饰方法AnyMethod()了:

[Help("this is a do-nothing class")]

public class AnyClass

{

[Help("this is a do-nothing method")] //error

public void AnyMethod()

{

}

}



编译错误: AnyClass.cs: Attribute ''Help'' is not valid on this declaration type.

It is valid on ''class'' declarations only.



  当然我们可以AttributeTargets.All来允许Help属性修饰任何类型的程序实体。AttributeTargets可能的值包括:

Assembly,

Module,

Class,

Struct,

Enum,

Constructor,

Method,

Property,

Field,

Event,

Interface,

Parameter,

Delegate,

All = Assembly
Module
Class
Struct
Enum
Constructor
Method
Property
Field
Event
Interface
Parameter
Delegate,

ClassMembers = Class
Struct
Enum
Constructor
Method
Property
Field
Event
Delegate
Interface )

  接下来,该看看AllowMultiple = false这句了:它确定了不能象下面这样,在同一实体上同时使用多个同种属性进行修饰: [Help("this is a do-nothing class")]

[Help("it contains a do-nothing method")]

public class AnyClass

{

[Help("this is a do-nothing method")] //这也是错误的,因为Help属性只能修饰类

public void AnyMethod()

{

}

}



编译错误: AnyClass.cs: Duplicate ''Help'' attribute



  我们再来谈谈AttributeUsage的最后一个数据属性Inherited:定义了自定义属性的修饰是否可由被修饰类的派生类继承。基于下示代码表示的继承关系,让我们看看会发生什么吧: [Help("BaseClass")]

public class Base

{

}



public class Derive : Base

{

}



我们选择了AttributeUsage的四种组合:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false ]

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false ]

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true ]

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true ]

对应上述组合的结果:

如果我们查询(稍后我们会看见如何在运行时查询一个类的属性信息。)这个Derive类的Help属性时,会因其未从基类继承该属性而一无所获。

因为同样的原因,得到与结果一同样的结果。

为了解释这后面的两种情况,我们把同样的属性也用在这个Derive派生类上,代码修改如下: [Help("BaseClass")]

public class Base

{

}



[Help("DeriveClass")]

public class Derive : Base

{

}

我们的查询会同时得到其类Base与派生类Dervie的Help属性信息,因为继承与多重修饰均被允许。

注意:

  AttributeUsage只能用于System.Attribute的派生类,且该派生类的AllowMultiple与Inherited都为false。



定位参数与命名参数   

  定位参数是属性类构造子(Constructor)的参数。它们是每次使用该属性修饰某个程序实体时都必须提供值的参数。相对的,命名参数则是可选参数,它也不是属性类构造子的参数。为了详细解释它们的含义,让我们给Help属性类加点内容,然后看看下面的示例: [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]

public class HelpAttribute : Attribute

{

public HelpAttribute(String Description_in)

{

this.description = Description_in;

this.verion = "No Version is defined for this class";

}

protected String description;

public String Description

{

get

{

return this.description;

}

}

protected String version;

public String Version

{

get

{

return this.version;

}

//即便我们不想我们的属性用户设置Version这个数据属性,我们也不得不提供set方法

set

{

this.verion = value;

}

}

}



[Help("This is Class1")]

public class Class1

{

}



[Help("This is Class2", Version = "1.0")]

public class Class2

{

}



[Help("This is Class3", Version = "2.0",

Description = "This is do-nothing class")]

public class Class3

{

}



我们查询Class1的Help属性信息时,会得到下列结果: Help.Description : This is Class1

Help.Version :No Version is defined for this class



  如果我们不定义Version数据属性的值,那么构造子函数体内所赋的缺省值将会使用。如果也没有,那么该数据属性对应的数据类型的缺省值将被使用(比如int类型的缺省值为0)。查询Class2将会得到这样的结果: Help.Description : This is Class2

Help.Version : 1.0



  请不要为了可选的参数而提供多个构造子的重载版本,而应该将它们定义成命名参数。我们之所以称其为“命名的”,是我们为了能在构造子里给它们赋值,不得不用一个个的标识符定义和访问它们。比如在第二个类中Help属性的使用[Help("This is Class2", Version = "1.0")] 你瞧,AttributeUsage的ValidOn参数就是一个定位参数,而Inherited与AllowMultiple则是命名参数。  注意:在属性类的构造子中给命名参数赋值,我们必须为它提供一个相应的set方法,否则会导致这样的编译错误(Version不能是一个只读的数据属性): ''Version'' : Named attribute argument can''t be a read only property



  当我们查询Class3的Help属性信息时会发生什么呢?会这样-因上述的原因导致编译错误(Description不能是只读的数据属性): ''Desciption'' : Named attribute argument can''t be a read only property



所以还是给Description添加一个set方法吧。这样会得到正确的输出结果: This is do-nothing class

Help.Version : 2.0



  这是因为构造子利用定位参数构造一个属性时,它会调用所有命名参数的set方法。构造子里的赋值行为实际均由各命名参数对应的数据属性的set方法完成,被其覆写(Override)了。



参数类型

  一个属性类的参数可使用的数据类型限于:

bool

byte

char

double

float

int

long

short

string

System.Type

object

枚举类型以及上述数据类型的一维数组

属性标识

  让我们想象一下,怎么才能把我们的Help属性用到一个完整的程序集(assembly)上?首先要面对的问题是该把Help属性放在哪儿,以便让编译器识别出它是属于一个程序集的?再考虑另一种情况:我们想把一个属性用在某个方法的返回类型上时,编译器如何才能确定我们把它用在了返回类型而不是这个方法本身之上?要解决这么多含糊的问题,我们需要属性标识。借助属性标识的帮助,我们可以明确地告诉程序集我们希望把属性放在哪儿。比如: [assembly: Help("this a do-nothing assembly")]



  这个Help属性前的assembly标识符显式地告诉了编译器,当前这个Help属性用于整个程序集。可用的标识符包括:

assembly

module

type

method

property

event

field

param

return

在运行时查询属性   

  我们已经知道了如何创建属性并如何在程序中使用它们。现在该学习我们所建属性类的用户如何才能在运行时查询该属性类的信息了。要查询一个程序实体的所有属性信息,我们得使用反射(reflection)-在运行时发现类型信息的一种功能。

  我们可以直接使用.NET Framework提供的反射Reflection API来枚举一个完整程序集的所有元数据(metadata),并产生该程序集所有类、类型、方法的列表。还记得之前的Help属性和AnyClass类吗? using System;

using System.Reflection;

using System.Diagnostics;





//attaching Help attribute to entire assembly

[assembly : Help("This Assembly demonstrates custom attributes creation and their run-time query.")]



//our custom attribute class

public class HelpAttribute : Attribute

{

public HelpAttribute(String Description_in)

{

this.description = Description_in;

}

protected String description;

public String Description

{

get

{

return this.deescription;

}

}

}



//attaching Help attribute to our AnyClass

[HelpString("This is a do-nothing Class.")]

public class AnyClass

{

//attaching Help attribute to our AnyMethod

[Help("This is a do-nothing Method.")]

public void AnyMethod()

{

}

//attaching Help attribute to our AnyInt Field

[Help("This is any Integer.")]

public int AnyInt;

}



class QueryApp

{

public static void Main()

{

}

}



  我们将在接下来的两节里在我们的Main方法里加入属性查询的代码。



查询程序集的属性   

  在接下来的代码片段里,我们获取当前进程的名字,并使用Assembly类的LoadFrom方法装载程序集。然后我们使用GetCustomAttributes方法获取当前程序集的所有自定义属性。接下来的foreach语句又遍历所有的属性对象,并试着将这些属性转化为Help属性(使用as关键字进行转换,如果转换失败,将会返回一个空值而不是触发一个异常)。再后的一条语句是指如果转换成功,则显示Help属性的所有数据属性信息。 class QueryApp

{

public static void Main()

{

HelpAttribute HelpAttr;



//Querying Assembly Attributes

String assemblyName;

Process p = Process.GetCurrentProcess();

assemblyName = p.ProcessName + ".exe";



Assembly a = Assembly.LoadFrom(assemblyName);



foreach (Attribute attr in a.GetCustomAttributes(true))

{

HelpAttr = attr as HelpAttribute;

if (null != HelpAttr)

{

Console.WriteLine("Description of {0}:\n{1}", assemblyName,HelpAttr.Description);

}

}

}

}



程序的输出结果: Description of QueryAttribute.exe:

This Assembly demonstrates custom attributes creation and

their run-time query.

Press any key to continue



查询类、方法和域的属性

  在下面的代码片段里,和上面的代码不同的只是Main方法的第一条语句变成了: Type type = typeof(AnyClass);



  它使用typeof操作符返回AnyClass对应的Type对象。其余的代码也类似上述的代码,我想不需要再做解释了吧。要查询方法和域的属性,我们首先要获得当前类中所有方法和类,然后再用类似于查询类的属性的方法来查询与之对应的属性。 class QueryApp

{

public static void Main()

{



Type type = typeof(AnyClass);

HelpAttribute HelpAttr;





//Querying Class Attributes

foreach (Attribute attr in type.GetCustomAttributes(true))

{

HelpAttr = attr as HelpAttribute;

if (null != HelpAttr)

{

Console.WriteLine("Description of AnyClass:\n{0}",

HelpAttr.Description);

}

}



//Querying Class-Method Attributes

foreach(MethodInfo method in type.GetMethods())

{

foreach (Attribute attr in method.GetCustomAttributes(true))

{

HelpAttr = attr as HelpAttribute;

if (null != HelpAttr)

{

Console.WriteLine("Description of {0}:\n{1}",

method.Name,

HelpAttr.Description);

}

}

}



//Querying Class-Field (only public) Attributes

foreach(FieldInfo field in type.GetFields())

{

foreach (Attribute attr in field.GetCustomAttributes(true))

{

HelpAttr= attr as HelpAttribute;

if (null != HelpAttr)

{

Console.WriteLine("Description of {0}:\n{1}",

field.Name,HelpAttr.Description);

}

}

}

}

}

下面是程序输出: Description of AnyClass:

This is a do-nothing Class.

Description of AnyMethod:

This is a do-nothing Method.

Description of AnyInt:

This is any Integer.

Press any key to continue



关于作者

Sadaf Alvi,卡拉奇大学的自然科学学士,主页http://www24.brinkster.com/salvee

标签:

[STAThread]的含义

[STAThread]


STAThread:Single Thread Apartment Thread.(单一线程单元线程)

[]是用来表示Attributes;



[STAThread]

是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA。用在其他方法上不产生影响。在aspx页面上可以使用 AspCompat = "true" 来达到同样的效果。这个属性只在 Com Interop 有用,如果全部是 managed code 则无用。简单的说法:[STAThread]指示应用程序的默认线程模型是单线程单元 (STA)。启动线程模型可设置为单线程单元或多线程单元。如果未对其进行设置,则该线程不被初始化。也就是说如果你用的.NET Framework,并且没有使用COM Interop,一般不需要这个Attribute。其它的还有MTA(多线程套间)、Free Thread(自由线程)。



[STAThread] attribute指示应用程序的 COM 线程模型是单线程单元。

而于此对应的多线程单元则是 [MTAThread] (多线程单元线程)



COM 线程模型只适用于使用 COM interop 的应用程序。如果将此属性应用到不使用 COM interop 的应用程序,将没有任何效果。



COM 线程模型可设置为单线程单元或多线程单元。如果应用程序线程实际调用了 COM 组件,则仅为 COM interop 初始化该线程。如果没有使用 COM interop,则不初始化该线程。



以下是找到的一个资料介绍:

Q. When I create a c# project from scratch in VS.NET, the generated code always have a [STAThread] attribute above the main routine. What does the STAThread attribute really do? Can I change it to MTAThread instead? I have searched website and books, no one seems to explain this well.



Asked by anon. Answered by the Wonk on February 17, 2003



A.



The STAThreadAttribute marks a thread to use the Single-Threaded COM Apartment if COM is needed. By default, .NET won't initialize COM at all. It's only when COM is needed, like when a COM object or COM Control is created or when drag 'n' drop is needed, that COM is initialized. When that happens, .NET calls the underlying CoInitializeEx function, which takes a flag indicating whether to join the thread to a multi-threaded or single-threaded apartment.



A multi-threaded apartment (MTA) in COM is more efficient, since any of a number of RPC threads from a pool can be used to handle a request. However, an object on the MTA thread needs to protect itself from multiple threads accessing it at the same time, so that efficiency comes at a cost.



The single-thread apartment (STA) in COM is inherently single-threaded and therefore no additional thread synchronization is needed. The STA is implemented using the thread's Windows message queue, which is how requests to objects on an STA are serialized. Because of how the STA thread is implemented, calls to objects on that thread are serialized with Windows message handling on that thread, making sure that everything, both the COM objects and the underlying windowing objects, e.g. HWNDs, are all synchronized. This is necessary for UI-oriented COM objects, like controls and drag 'n' drop, which must also be synchronized together with the UI.



When COM is needed .NET will call CoInitializeEx, picking the MTA by default because it's more efficient. However, to get the synchronization needed for controls, windows and drag 'n' drop, you need to mark a thread's entry point with the STAThreadAttribute to let .NET know to initialize the UI thread on the STA. All of the VS.NET project templates put that attribute in to make sure you don't forget:

大致意思是:由于很多COM在.NET环境下如果使用多线程的话,会导致引用的COM不能正常运行,而如果不声明程序为STAThread的话,.NET就会自动使用多线程来提高效率,这样就会导致不可预知的后果。









以下引用另一同辈的发言:http://blog.csdn.net/qilang/archive/2006/06/06/775605.aspx

STA不是单线程的意思.英文为single threaded apartment.是一种套间(或译为公寓)线程模式.



sta thread并不表明应用程式的类型,和应用程序不搭界,恰相反,一个应用程序可以有多个线程.每个线程也可以有多个组件或对象.以前win16位系统的组件线程模式才真正是单线程.这是一种被淘汰了的模式.

线程模式用于处理组件在多线程的环境里并行与并互的方式.比如套间线程(STAThread)模式中接口跨线程传递必须被调度(Marshal),不调度直传肯定会失败!而MTA或FreeThread模式中的接口可以不经调度直接传递.

这种调度在特定的环境中非常影响性能(可有几百倍之差).如VB里只支持STAThread模式.FreeThread模式的组件会在里面表现成和跨进程一样慢!

线程模式是微软的COM基础中的极其重要的概念.一定要吃透!

我对.net真是一窍不通(没空去弄,对不起微软去年的奖赏).但我可以肯定,C#中的[STAThread]属性是应用程序的套间初始化代码.可以直接理解成SDK里的

CoInitialize(NULL);

初始一个STA套间实际上是相当于开了一个消息窗口,所有调用经此窗口过程调度到组件内.

同理[MTAThread](不知有没有这个属性,自已去查)

可以理解成

CoInitializeEx(NULL,COINIT_MULTITHREADED )

这经常是一个对初入com大门的人来说,有一定难度但必须过的一道关.

标签:

双面透明概念手机:Gassy(组图)(

透明玻璃主题的概念手机看到了不少,不过这一款看起来相当有型了。设计者的名字叫做Mac Funamizu,看这名字像个水果的Fans,所以设计出来的手机就透着那么一股水果的风格。话说概念手机这么多,厂商们撇几眼过来吧,挑几个看的上的做出来几款也好啊。



标签:

感知天气 全透明Windows Phone惊艳曝光

全球首款透明键盘手机LG GD900无疑是今年下半年手机市场上的时尚领袖,其大胆采用的透明式键盘结合当前流行的触控技术为用户带来了全新的操作体验。如果说GD900已经让你大呼过瘾的话,那么接下来这款名为Windows Phone的产品则将会带你领略更高一级的魔幻触控。



据国外媒体报道,一位名叫Seunghan Song的设计师由于对当地气象局预报天气的工作不满,而突发灵感设计出了这款令人惊叹的触屏手机。与GD900相比,该机竟然将整个机身都设计成为了透明状,搭配美观的用户界面给人以超乎想象的美感。更不可思议的是,该机还可以通过感知外界气候而在屏幕中及时显示出当时的天气情况。比如下雨时,手机表面会出现一片水珠,而当外界温度过低时,手机屏幕还会生起团团哈气。



标签:

无缝式全触屏概念手机惊艳曝光

科技发展的是在太快了,手机从大哥大演变到iPhone、Palm Pre似乎也只是几个瞬间。但是,手机的发展并不会终止,最前沿的概念设计师们一直在引领着手机的最尖端科技前进。这款手机出自设计师Seunghan Song之手,手机具备一个全触摸屏,触屏下端呈圆形凹陷状。


手机具备重力感应功能,凹陷处显示屏和与显示屏其它部分实现分屏,也可变为导航键。




手机的“无边”设计让您感觉您那在手里的就是一块显示屏,感觉超级梦幻超级炫!怎么样?您已经开始流口水了吧!只可惜这款手机还处于概念手机阶段,您还是慢慢等吧!


标签:

颠覆传统相机理念让你体验特工生活

  你想切身的体会到当007的快感吗?试想一下,当别人在毫无察觉的情况,便轻松的捕获到别人的照片时,是不是感觉自己就像是一名特工!Oneshot是一款颠覆常理的便携式相机,它可以抓拍很多意想不到的画面。Oneshot照相机秘但不缺乏创新意识:它需要人们通过摇动产生出和挤压产生出它所需要的电能,没有令人捉摸不透的按键,只要你像点击圆珠笔一样的轻轻触摸她便抓拍到任何瞬间.当你需要在电脑上浏览所拍到的画面时,你就可以将它“解剖”了,他内部带有一个迷你usb连接器,只需和电脑相链接,图片就会呈现在你的眼前。哈哈,快装着它,到处抓拍去吧!

标签:

让生活中的噪音转化为能源的转换机

摆在你面前的这个名为Sonea的玩意并不是个没头脑的盒子哦,也不是吓人的爆炸物,它是由Jihoon Kim, Boyeon Kim, Myung-Suk Kim和Da-Woon Chung设计的能将声音转换成能源的机器,它能将这些从废物中提取的能源转换成炼钢所用电量和街头路灯的电流。由碳酸盐,丙烯腈和其他一些元素制成的Sonea,单个尺寸为450mm×450mm×80mm,整体重7公斤,它所收集的每分贝噪音可以转换30瓦的电量,看上去很实用。如果一架飞机起飞时候的噪音能达到140分贝,那么收集起来转换成电量将达到240千瓦,以此推算,我们以每天500架飞机起飞的话,所获电量将是120兆瓦,假如这样持续积攒一年的话,这些能量将是8000吨石油所能产生的能量。这是一个多么惊人的数字,希望它能尽快的进入到我们的生活中,并减少对地球能源的过渡使用。



标签:

华丽的陶瓷扬声器点缀你的乏味生活

这款手工制作的扬声器是由旧金山的Joey Roth所设计的,他软木塞和陶瓷设计出的扬声器带给你“完整的试听”享受。它以复面胶合板作为基础,并加入了音量滑动器。




  它拥有四个全面的驱动器和T类的扩音器,软木塞和瓷器的组合加上运用简单的方法是你的耳朵彻头彻尾的让你享受到被音乐包围的感觉。看似没有用途的东西,居然可以创造出这么美观实用的东西,它完全就是一件艺术品。




标签:

用USB扫描器把尘封的老底片重新上色

对于35mm的老式照片底片我们现在基本上把它们遗忘在了抽屉里。但是我们这些被我们忽略了的老底片在USB底片扫描仪巧妙的作用下,重新填上了新的颜色。




  把老式的35毫米底片放在这个放在这个扫描仪上,它可以将底片里的内容转换成数字图片。然后通过USB接口连上电脑编辑图片,并做好印刷之前的准备。



  扫描仪不需要任何的外部电能,通过USB与电脑相连便可以工作。在扫描仪的工作下,使得显示在电脑上的图片自动调整背景光并且使色彩更加的平衡。拥有了这么一款实用的工具,那些被遗忘的底片终于重见天日了,呵呵。




标签:

兴奋!在未来你将使用这样的概念笔记本

这是Felix Schmidberger 为2015年设计的OLED触摸屏的笔记本电脑。它的外观看起来平滑并附有金属感,而且厚度相当薄,它由两个滑动的OLED屏幕构成,其中一个屏幕可作为键盘,可以在必要的时候使用。它支持手写功能,拿起手中的电子笔在屏幕上进行操作,这样大大的简化了我们对于键盘的操作。虽然这是未来的设计,但是设想一下,如果真的到了那一天,是不是会有比这个更好的出现呢?



标签:

你不用为找不到电源充电而愁眉苦脸了

当你在给别人打电话时,正在开心的玩着PSP时,或者在听着iPod时,它们的电量突然被用光了,这个时候是不是非常的郁闷,后悔当初为什么没有充足了电量。当你身在外面,无法找到电源充电,你肯定会觉得很懊丧,但是现在不用再为这种事而烦恼了,这是一款专门方便人们充电的太阳能充电器。



  它外壳由铝制成,在你需要使用时,把它拉扯打开,里面配备了两块光滑的太阳能电池板,把它放在阳光充足的地方进行充电。当它充满电后你便可以用适合你的插槽来给你的装备充电了,它的表面配有LED提示灯,美观大方。你也可以在电脑上通过USB给你的太阳能板充电,然后把它折叠起来随身携带。





标签:

多媒体床头播放器改变你的低品质生活





 好吧,我承认,这款播放器最先吸引我的是米勒的剧照! 看到上面的字幕就知道这是韩国的产品了:Bedside Multimedia Player多媒体床头播放器,除了能当闹钟,它还能与互联网连接,下载到最新的音乐、视频、新闻和天气和股市信息。你可以轻轻松松的躺在任何地方方便的收看节目,简化并提高了你的生活品质。这样,每天睡前看看最近更新的美剧,早晨再伴着你喜欢的音乐醒来,这样的生活是要多美妙呢~



标签:

Peugeot小球形状转移电车真实地适应环境

由Ahmad Moslemi设计的感念车,看起来是不是已经打破了常规概念车的模式? Peugeot小球由四不同部分,其中每一个做成以一位乘客容量并且由一台电动机供给动力,并且这些零件一起被连接到集中化电池系统。这四个零件在非常灵活的聚合物覆盖物包含,结合在一起使零件和他们的连接。




  这辆车根据周围环境的不同而改变车身形状。 为了穿越一个狭窄的道路,它可以把每个座位进行调整变得细长以便穿越狭窄的地方。 Peugeot小球在130 cm x 130 cm空间内可以随意的变换车头与车尾。基本上每个小球是一样的,只有司机的位置上是带有方向盘和仪表盘。这款概念车的行驶速度大大降低了交通危险,并且由于它的体积可以任意的变形,所以可以占用很小的停车位。汽车的首尾光能改变与车的形式并且是非常灵活的。通过增加更加球状的零件,用户能增加车的容量,并且,因为每个球状部分都有独立拥有一个电子马达,在动力上没有任何问题。拥有这样一款交通工具,是不是为你省去了很多事情?




标签:

采用Android系统的PMP 欣赏音乐更开怀

不久前在八月底,Archos于FCC时曾曝光一台Android系统的播放器,推测就是采用Android系统的PMP。在最近就推出了这款Archos 5 Internet Tablet(这和FCC长得好像呀,到底是不是一样的?),相信这款PMP会吸引不少玩家的眼光,采用的是800MHz OMAP3440处理器,有着4.8寸800 X 480分辨率的屏幕,支持720p影片,硬盘容量最高可达500GB,并且有802.11n。在操作上,除了可以通过触摸屏幕之外,在安装基座之后,可以与选购的无线小键盘配对(当然,只要是蓝牙的键盘或是鼠标都OK),尤其在外接屏幕的时候,这样的操作方式也更加方便些。



标签:

让你现在不被人察觉的情况下收听音乐

 Thanko第八代Microsports MP3播放器,仅拥有16x25x22mm的尺寸,并且现在可用的有2GB或4GB的,在你手里放着的是世界上最小的MP3播放器了,我从未看到过这么小巧的MP3播放器,让你领教到使用一根超细的线圈便可以在你工作的同时享受到立体声音乐,因为这个线圈就是这个播放器的关键所在,它可以在你耳边放出优美的音乐。事实上它最完美的是在周围的人毫无察觉的同时收听你的音乐,这样的效果谁会想到仅仅是通过类似头发的一根线圈呢!



标签:

享受沐浴新感觉 超现代感的节水淋浴器









对于某些边远地区的人们来说,要洗个痛痛快快的热水澡还是件奢侈的事情。所以,当你洗浴的时候还是要提醒自己节约用水哦。D.K. 和Wei日前就推出一款前卫的淋浴装置Arc Shower,意在通过回收水源反复利用达到节约用水的目的。这款弧状淋浴器可将使用过的水在底部进行过滤,然后进行加热,而重返顶部的淋蓬头喷出。通过防水触摸屏,你可以对喷头和水温进行控制。不过总觉得这款产品的概念性大于实用性,毕竟洗澡水回收这件事有点怪怪的,不知各位看官的想法是怎样呢?

标签:

植物空气过滤器 Andrea air purifier

不得不说现在咱们城市里的空气质量是越来越差了,可是你知道吗,由于缺乏流动性,室内的空气质量可能要比室内更差。日前,Mathieu Lehanneur和哈佛教授David Edwards就针对这一问题研究出了一款新型的空气过滤器,其最大的亮点在于采用植物来对空气进行过滤,它会抓住一些空气中的有污染嫌疑的粒子,再把干净的空气通过排气扇放出。目前这款产品零售价为199美元一个,到底是哈佛研究来的东东,多贵也不稀奇了~



标签: