- 締切済み
PHPの関数をC#で再現したい
このジャンルでお願いします。 C# 2010 version 4.0を使用しています。 PHPという言語で isset( mixed $var [, mixed $... ] ) ・・・ 変数がセットされており、それが NULL でないことを調べる と array_key_exists ( mixed $key , array $search ) ・・・ 指定した key が配列に設定されている場合、 TRUE を返す という2つの関数がありますが、それぞれC#で同じような機能を再現しようとした場合に、 どのような記述やメソッドを使えば良いのでしょうか? 自分としては、C#のListを使って試しているのですが、 Listのメソッドにそれらしきものがなくて、 Countプロパティで指定したインデックス以下だったらと存在しない という無理なやり方しか思いきません・・・ if (list.Count <= indexKey) { /*存在しない*/ } 上の2つの機能をなんとかして再現することはできないでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Yune-Kichi
- ベストアンサー率74% (465/626)
・isset 厳密にisset相当は存在しません。 C#は ・変数の宣言が必須 ・変数の初期化が必須 (少なくともdefault(T),つまりは値型はnew T(),参照型はnullで初期化される) ため,「未定義」が存在しないためです。 で,値型 (structやenum,ほとんどのC#組み込み型) はnullになることがありません。 # 正確にはnull許容型というのがありますが,特殊な値型なので除外。 参照型 (classやdelegate, interface) はnullを設定することができます。 この場合,nullと比較することにより確認ができます。 ・array_key_exists これを使うと言うことは,おそらく連想配列として使っているのでしょうか。 そうであれば,List<T>よりもDictionary<TKey, TValue>を使うべきでしょう。 この場合,DictionaryのContainsKeyが使えます。 List<T>がよいのであれば,キーが何かを決めて,Existsメソッドで比較するか,Contains拡張メソッドで比較することになるでしょう。 # List<T>.ContainsはEqualsによる比較なので,常にキーで等しいとする場合を除いて使いにくいかと。 References) MSDN: Dictionary(TKey, TValue) クラス (System.Collections.Generic) http://msdn.microsoft.com/ja-jp/library/xfhwa508(v=vs.100) MSDN: Dictionary(TKey, TValue).ContainsKey メソッド (System.Collections.Generic) http://msdn.microsoft.com/ja-jp/library/kw5aaea4(v=vs.100) MSDN: List(T).Exists メソッド (System.Collections.Generic) http://msdn.microsoft.com/ja-jp/library/bfed8bca(v=vs.100) MSDN: Enumerable.Contains(TSource) メソッド (IEnumerable(TSource), TSource) (System.Linq) http://msdn.microsoft.com/ja-jp/library/bb352880(v=vs.100)
お礼
ご回答ありがとうございます。 このisset、array_key_existsの使い方については PHPのZend Frameworkというフレームワークの http://manual.zfdes.com/ja/zend.db.profiler.html http://ideone.com/JekM0d ┬ Zend │└ Db │ ├ Profiler │ │└ Query.php Query.phpというファイルのクラスZend_Db_Profiler_Query内のbindParamsメソッド の if (array_key_exists(0, $params)) { array_unshift($params, null); unset($params[0]); } の部分の処理です。 どうやらこの引数の$paramsは連想配列とただの配列、両方を 受け取ってるような気がするのですが、実際はどうなんでしょうか? すいません、自分としてはこのフレームワークのデータベース関係を ほとんどそのままC#で再現したいと思っているのですが、 それに関して新たに質問を立てるのもどうかなと思いますので ここでもう1つ質問に答えて頂けないでしょうか? 次の処理を見てもらいたいのですが、 class c { protected $a = 0; public function f(&$ii) { $this->a = &$ii; } public function p() { print $this->a . "\n";// 2と表示される } } $i = 1; $co = new c(); $co->f($i); $i = 2; $co->p(); このcクラスの$this->aは$iの参照を保持しているので、 $iが2に変わったら$this->aも2に変わります。 このような変数の参照を維持する仕組みはC#だと どのようにして実現できるのでしょうか? 自分なりにrefを使って試してみたのですが、 public class c { private int a = 0;//このメンバをなんとかして参照を保持できるようにできないか? public void f(ref int ii) { this.a = ii; } public void print() { Console.WriteLine(this.a);//1と表示される } } class Program { static void Main(string[] args) { c co = new c(); int i = 1; co.f(ref i); i = 2; co.print(); } } aがただのint型なのでiを2にしても1のままでした・・・ どうやらこのZend FrameworkのbindParamの処理も このような変数の参照を保持してSQLの実行時に 変数の中身を取得するような処理をしているらしいので なんとかこの機能を再現することはできないでしょうか?