C♯相談室 Part13

このエントリーをはてなブックマークに追加
928デフォルトの名無しさん:04/02/16 18:48
>>926
>>927
すいません。どっちも何で分かるのかが分かりません。
言いたいことの趣旨が理解できません。
分かるようにお願いします。

もしかして、>>927>>926に対する反論と言う形になっているわけですか?
だったら分かります。
>>928
MyStruct a = methodReturnsMyStruct();

aのフィールドは初期化されるのか?
結局メソッドの戻り値が代入されるのに?
逆に初期化されないのか?
それは勝手に省略しても大丈夫なのか?

パラメータに渡す場合も同じ。

それとstruct導入の大きな理由にパフォーマンスの向上があった。
値型はもともと、小さくて、コピーできて(しなければならなくて)、頻繁に利用するデータ向けだから。
あえて初期化子もデフォルトコンストラクタも禁止することで速度を上げてる。
> aのフィールドは初期化されるのか?
> 結局メソッドの戻り値が代入されるのに?
.NETってその程度の最適化もされないの?
>>930
次の2行嫁や。
> 逆に初期化されないのか?
> それは勝手に省略しても大丈夫なのか?
932デフォルトの名無しさん:04/02/16 19:37
逆に初期化って?
勝手に省略してもいい気がするけど、何で駄目なのですか?

つまり構造体のインスタンスを作ったときに、
そのフィールドにどういう値が入るかという問題でしょ。
それは、代入してもいいし、最初から入っててもいいし、コンストラクタでもいいし、何でも別に
いいじゃないですか。
つまりクラスと同じで良いんじゃないですかね。
そんなことコンパイラが適当にやってくれそうな気がするのですが。
933デフォルトの名無しさん:04/02/16 19:39
>それとstruct導入の大きな理由にパフォーマンスの向上があった。
>値型はもともと、小さくて、コピーできて(しなければならなくて)、頻繁に利用するデータ向けだから。
>あえて初期化子もデフォルトコンストラクタも禁止することで速度を上げてる。
まあ、この最後の3行ならば十分自分の頭にも理解できます。
>>932
その初期化に副作用があるかもしれないじゃん。
勝手に省略したらプログラム動かなくなるかもよ。
初期化で副作用起こすようなタコプログラムは動かなくていいと俺も思うが
言語仕様で禁止することはできないし。
Cのように”未定義”とでもすりゃいいけどいまどきそりゃ無いだろ。
935デフォルトの名無しさん:04/02/16 20:28
全然わからん。
普通、クラスのフィールドでもコンストラクタで初期化するもんじゃない?
937名無しさん♯:04/02/16 21:13
早めに次スレ立てときますた。
http://pc2.2ch.net/test/read.cgi/tech/1076933504/l50
938デフォルトの名無しさん:04/02/16 21:16
まあ、普通は確かにそうだけど、
それとは別に、初期化子を指定することもできるわけで、
構造体には何でそれができないのかが、やはりちょっと気になったわけで、
何か指定できないようにした方が、良いちゃんとした理由があるのかなと思ったわけですよ。
で、どうやらこれといった特別な理由はなさそうだと言うのが自分の印象ですが。
まあ、もともと大した疑問じゃなくて、msの言語に対する仕様の理念とは何かを
聞いておきたいだけのちょっとした質問に過ぎないので、別にそれでも良いんですけどね。
釣りかよ・・・
構造体のコンストラクタには、一つ以上のパラメータが無ければならないというのが一つの答えになってるんじゃない?
>>940
いや,だからその制約が必要には思えないって話だろうが…
値をコピーするときにデフォルトコンストラクタが呼ばれるようにするかしないかで問題が発生するってんだろ。
C++ならコピーコンストラクタで解決だが。
943デフォルトの名無しさん:04/02/17 16:15
ちーたんは夜の妖精だから、い
んらんでとってもイケナイ娘なの。
これからはじまる素敵なパーティ
が、私を狂気の渦へいざなうの。
黒いドレスに身をつつみ、あやし
く光るその瞳には、この世の全
てを欲する悪魔が住んでいるの。
するどい視線で獲物を狙って、あ
みタイツの隙間から滴るエキスで
まえもうしろも濡れ濡れになるの。
せまくて暗い通路の奥で、はじけ
んばかりの快感が私を襲うの。
スクリプティングでC#のクラスを利用しようとしているのですが、次のようなコードで
WebRequest の Type を取得しようとすると TypeLoadException を投げてきます

抽象クラスの Type の取得はどうすればいいのでしょうか?

static void Main(string[] args)
{
  try {

    Type req_type = typeof(System.Net.WebRequest);
    Console.WriteLine(req_type.FullName);

//  string type_name = "System.Net.WebRequest";

    // 元々は type_name を入れてた
    Type request = Type.GetType(req_type.FullName, true);

    Console.WriteLine(request.FullName);

  } catch ( TypeLoadException e ) {
    Console.Write(e.Message);
  }
}
945944:04/02/17 18:21
く、すみません、事故解決してしまいますた(鬱
AssemblyQualifiedName で指定してやると逝けました
946デフォルトの名無しさん:04/02/17 21:49
intやfloatも構造体です、と言えば分かってもらえるかな?
>>946
バカ登場
>>949
再びバカ登場
サンプルどおりにプログラムを組んでもコンパイルできません。
どこがおかしいんですか?

#include <stdio.h>
void main(void){
    printf("Hello, world.\n");
}
↓age厨
>>949
スレ違い。
それはC言語です。CとC#は違います。
ここはC#のスレです。
>>951 メール欄
サンプルどおりにプログラムを組んでもコンパイルできません。
どこがおかしいんですか?

(defun fib (n)
(if (or (= n 0) (= n 1))
1
(+ (fib n) (fib (- n 1)))))
>>953
それ無駄多い。反復的手続きに汁。
>>953
無限ループになってるよ。こうしろ。

(defun fib (n)
  (if (or (= n 0) (= n 1))
      1
      (+ (fib (- n 1)) (fib (- n 2)))))

>>954の言うとおり反復的プロセスにしたほうが断然効率がいいがな。
956 :04/02/18 01:04
datagridのdatasourceをdataviewにすると、datagridstyleculumとか設定しても
無反応なんだが どうして? datasourceをdatasetにしてdatamember指定すると
うまくいくんだが。。。。
>>954
樹状再帰主義なので嫌だ
C#でPHPソースを解析するコードを書いています。
PHPの変数の正規表現は「\$\w+」のはずで
(厳密にやるつもりはないのでこれで十分です)
秀丸で検索してもマッチします。
しかしC#でライブラリを利用してこの正規表現を使おうとすると
「認識できないエスケープシーケンスです」
というエラーが出ます。
どういう正規表現にすればC#で使えるのでしょうか?
>>958
\はエスケープシーケンスなので\を文字列中で表現するなら
\\と書くか、
@"\#\w+"と@プリフィクスを付ける。
#ってなんだよ……
961958:04/02/18 16:10
>959
解決しました。
ありがとうございます。
んんん・・・そんな単純なことですか・・・
確かにヘルプのサンプルに@がついてたような気が・・・
どうも申し訳ありません。
962デフォルトの名無しさん:04/02/18 21:35
教えてください。
複数のFormを持つプロジェクトで共通に使用する定数や変数ってどこに記述するのでしょう?
どこでも勝手に記述しろ。
964デフォルトの名無しさん:04/02/18 22:05
初心者ですが、宜しくご教授ください。
WindowsフォームでListViewとButtonを作り
さらにListView上にLargeImageListと
ListViewItemでアイコンを作りました。
シングルクリックでアイコンを選択したあと
ボタンを押したらどのアイコンが選択されたかの
情報が欲しいんですが
どうやって取得すれば良いでしょうか?


>>964
TreeView1.SelectedNode
>>965
ありがとうございます!

964です・・・
鬱市
968965:04/02/18 22:25
まちがえたリストビューだった。
ListView1.SelectedItems
で選択されているListItemのコレクションが取得できる。

>962
そういう時こそ厨房御用達兵器「Singleton」の出番だ!
970964:04/02/18 23:19
>>968
ListView1.SelectedItemsでしたか…
それは一度試してみたんですが
ListItemのコレクションとやらを
どう操作したらいいのかわからんかった…
971最凶VB厨房:04/02/18 23:35
ListView.SelectedListViewItemCollection slic=listView2.SelectedItems;
foreach (ListViewItem lvi in slic)
{
Console.WriteLine(lvi.Text);
}
//(゚ロ゚;))((;゚ロ゚)
>971
いやー、C#実はさっぱりわからんのだけど、
そのConsole.WriteLineの出力ってどこに出るの?
(IDE上で動かせばIDEのどこだかに出るのかな)
973最凶VB厨房:04/02/18 23:59
デバッグウィンドウかコマンドプロンプト上か。

ビルド時のオプション指定の違いかな。推測。
974デフォルトの名無しさん:04/02/19 12:11
ごめん、そのオプション教えてくれ。
俺もコンソールに出力しながらデバッグしたいんだが、やり方がわからん。
using System.Diagnostics;
Debug.WriteLine(hoge); じゃだめなのか?
976最凶VB厨房:04/02/19 19:58
>>974
///////////////////a.cs
using System;
public class a
{
public static void Main(string[] args)
{
Console.WriteLine("(゚ロ゚;))((;゚ロ゚)");
System.Threading.Thread.Sleep(5000);
}
}
/////////////////////////
csc /t:exe a.cs
/////////////////////////
csc /t:winexe a.cs
>>972-974
「表示」→「その他のウィンドウ」→「出力」