主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#: クラスやメソッドの宣言時に知っておくこと

                
クラスやメソッドや変数の定義に出てくるpublicやprivateから。いわゆる「アクセシビリティ」。どの範囲にまでその変数をアクセス可能にするか。
参考:http://dobon.net/vb/dotnet/beginner/accessibilitylevel.html

public→どこからでも使える

protected→そのクラスやメソッドが定義されているメンバーから、もしくはその派生クラスからのみ使える

internal→同じアセンブリからなら使える

protected internal→同じアセンブリ、もしくは派生クラスからのみ

private→そのクラスやメソッドが定義されているメンバーからのみ使える



続いて修飾子staticをクラス定義に使う場合。最近、Expression Encoder SDKを使ってスクリーンキャプチャ機能を提供するクラスを作っているときにお世話になった。これはどういう効果を持つか一番しっくりきた表現はMSDNにあった、「静的メンバーは、インスタンスを使って参照できません」ということ(参考:MSDN)。
インスタンスを作らずに使う関数の寄せ集めのクラスを作りたいときに使った。
以下のコードで、ThumbnailGeneratorクラスは外部から見ると、SaveThumbnailメソッドとGetThumbnailメソッドのみを持つ。ThumbnailGeneratorクラスのインスタンスは必要としておらず、外部からSaveThumbnailメソッドかGetThumbnailメソッドのすきなほうに引数を渡して使うようになっている。インスタンスを作らずにそれぞれのメソッドにアクセスできるようにするために、staticにせねばならない。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Microsoft.Expression.Encoder;

namespace Generator
{
public static class ThumbnailGenerator
{

public static void SaveThumbnail(string src, string outputName, double point)
{
Bitmap thumbnail = GetThumbnail(src, point);

// sets thumbnail name unique and saves
thumbnail.Save(outputName, ImageFormat.Jpeg);

thumbnail.Dispose();
}

public static Bitmap GetThumbnail(string src, double point)
{
Bitmap thumbnail;
//string bitmapDir = Environment.CurrentDirectory;

if (!File.Exists(src))
{
System.ArgumentException argEx = new System.ArgumentException("Source file not found");
throw argEx;
}
AudioVideoFile avFile = null;
try
{
avFile = new AudioVideoFile(src);
}
catch (Exception ex)
{
System.ArgumentException argEx = new System.ArgumentException(ex.Message);
throw argEx;
}

// Gets the time for each thumbnail.
if (point > avFile.Duration.TotalSeconds)
{
Console.WriteLine(avFile.Duration.TotalSeconds);
System.ArgumentException argEx = new System.ArgumentException("Over a duration");
throw argEx;
}

// Create ThumbnailGenerator object to get thumbs from AudioVideoFile
Microsoft.Expression.Encoder.ThumbnailGenerator generator = avFile.CreateThumbnailGenerator(avFile.VideoStreams[0].VideoSize);

// Gets image based on timing
thumbnail = generator.CreateThumbnail(TimeSpan.FromSeconds(point));

generator.Dispose();
return thumbnail;
}
}
}

staticをメンバに使う場合は下記を参考に。インスタンスごとに変える必要がなく、インスタンス間で共通の変数にしたいときなどに使うものらしい。
http://ufcpp.net/study/csharp/oo_static.html



C#の基礎はこんなところか。オブジェクト指向のコンセプトである「内部実装は隠蔽して、外部の振る舞いだけを使用者に見せる」といったようなコンセプトが基礎レベルからもろに出ているように感じる。

ぼくが学んだ言語としてC#は6番目だ。Cから始まってスクリプト言語をいくつか経てC#に出くわした。で、C#を書いてみた感想は「素晴らしい。だけどプログラミング経験のない人には教えたくないな」。

はじめて学校でCを習ったとき、単純な整数同士の加算をやるにも、いわゆる「おまじない」がたくさん出てきた。「stdio.hヲインクルードシテクダサイ」、「ヘンスウヲカタヲキメテセンゲンシテクダサイ」、「mainノウシロニカッコヲツケテショリヲカイテクダサイ」などなど。いくらかやっているうちにスラスラと書けるようになって、学校での演習時間も持て余すようになった。その一方で、できない人は変数宣言にすら納得ができていなかった。
数年後、大学の卒研で初めてスクリプト言語に触った。MATLABのクローンでScilabというものだ。処理を書くための「おまじない」が少ないのがとっつやすかった。この言語で計算式や定数、変数を書いていくことで物理的なシミュレーションをおこなうプログラムを作り、はじめてまともなプログラムを書いたなと感慨を得た。そのあとにPythonとJavaScriptに触れてオブジェクト指向やらなんやらいっそうプログラミングらしいことに触れていた。そこで「おまじない」を使うと、プログラム作成が便利になったり、コードをきれいに書けたりすることを知った。

で、C#へ。すべてがクラスであったり、メソッド宣言時にstaticやprivateで容易にアクセシビリティを決められたり。書いたものの管理や流用が楽だなーと感じた。
でもこれが初めてのプログラミング言語だったらそんなことは思わなかったと思う。「おまじない」が盛りだくさん。staticとかprivateってなにさ? いや、そもそもすべてがクラスだなんて「クラス」も知らんわ。基礎部分がCより厚いんじゃないかと思う。実際仕様書はC#のほうが厚いらしいし。

個人的にC#はより玄人向けな言語なんじゃないかなーと感じるところ。これを通じて育った人は一層優れたものになるけど、スクリプト言語なんかと比べるとだいぶ重いギブスみたいだなと。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。