Lazy<T>クラス
https://msdn.microsoft.com/ja-jp/library/dd642331%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
にあるように変数の遅延初期化を行えます。
正直Lazy<T>を使わなくても書き方はいろいろありますが、
- コンストラクタの引数つかって初期化処理するけどその引数をわざわざフィールドなりで持つまでもない
- Parallel or Task 越しに触れるようにしておかなければいけない
場合はLazy<T>推奨なわけです。
よくある使い方
private Lazy<HogeClass> _hoge;
public HogeClass Hoge { get { return _hoge.Value; } }
遅延初期化したいプロパティなどで上のような書き方をすることがよくある(毎回 .Value
を書きたくない)と思いますが。。。正直めんどくさい。
のでスニペット作りました。
Lazy<T>なフィールド、プロパティでゲット
lazy.snippet
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>LazyProperty</Title>
<Shortcut>lz</Shortcut>
<Description>Lazy Property</Description>
<Author>Taro Furuya</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>typename</ID>
<ToolTip>TypeName</ToolTip>
<Default>TypeName</Default>
</Literal>
<Literal>
<ID>fieldname</ID>
<ToolTip>FieldName</ToolTip>
<Default>_fieldName</Default>
</Literal>
<Literal>
<ID>propertyname</ID>
<ToolTip>PropertyName</ToolTip>
<Default>PropName</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[
private Lazy<$typename$> $fieldname$;
public $typename$ $propertyname$ { get { return $fieldname$.Value; } }
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
Lazyのフィールドがreadonlyバージョン
readonlylazy.snippet
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>ReadonlyLazyProperty</Title>
<Shortcut>lzr</Shortcut>
<Description>Readonly Lazy Property</Description>
<Author>Taro Furuya</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>typename</ID>
<ToolTip>TypeName</ToolTip>
<Default>TypeName</Default>
</Literal>
<Literal>
<ID>fieldname</ID>
<ToolTip>FieldName</ToolTip>
<Default>_fieldName</Default>
</Literal>
<Literal>
<ID>propertyname</ID>
<ToolTip>PropertyName</ToolTip>
<Default>PropName</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[
private readonly Lazy<$typename$> $fieldname$;
public $typename$ $propertyname$ { get { return $fieldname$.Value; } }
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
使い方
これらをファイルに保存してからVSのツール>スニペットマネージャから追加してください。
任意のクラスの直下でlz->tab or lzr->tab で
ex.cs
private Lazy<TypeName> _fieldName;
public TypeName PropName { get { return _fieldName.Value; } }
こんな感じのできるのでTabで移動しながらTypeName,_fieldName,PropNameを入力すればできあがりです。
ほんのり楽になります。