ふらっとC#,C♯,C#(初心者用) Part31at TECH
ふらっとC#,C♯,C#(初心者用) Part31 - 暇つぶし2ch511:デフォルトの名無しさん
08/10/05 22:18:10
>508 大変ありがとうございます。
double, floatなどでもつかえるようにしてみようとおもいましたが
==, >の比較ができなく困ってしまいました。
class MathEx
{
public static T[] Maxs<T>(T[] arr) where T : IComparable
{
T max;
int cnt;
省略
max = arr[0];
cnt = 1;
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] == max)
cnt++;
if (arr[i] > max)
{
max = arr[i];
cnt = 1;
}
}
T[] result = new T[cnt];
省略
}
}
もうちょい悩んでみます。

512:デフォルトの名無しさん
08/10/05 22:24:07
質問者です。以下でなんとかいきそうでした。
if (arr[i].CompareTo(max) == 0)
cnt++;
if (arr[i].CompareTo(max) > 0)

513:デフォルトの名無しさん
08/10/05 22:24:08
>>511
.CompareTo

514:デフォルトの名無しさん
08/10/05 22:27:46
>513
ありがとうございます。このスレでもでてきたEachForや今回のMaxsのような独自の便利
関数は、みなさんどのように管理されてるんでしょうか??なにかアドバイスあればお願い
します。

515:508
08/10/05 22:29:30
>>509
public static int[] Maxs(int[] arr)
{
int max = Int32.MinValue;
int cnt = arr.Length == 0 ? 0 : 1;

foreach(int value in arr)
{
if(value == max)
cnt++;
if(value > max)
{
max = value;
cnt = 1;
}
}

int[] result = new int[cnt];
for(int i = 0; i < cnt; i++)
result[i] = max;
return result;
}
うーん、こうかな…

516:デフォルトの名無しさん
08/10/05 22:37:19
>>515
まあ、まずまずだけど、ひとひねりほしいな
例えば再起処理を使うとかさ
forでやるのはダサイ

>>514
管理ってなんぞ?クラスで定義すればいいんじゃねーの?

517:デフォルトの名無しさん
08/10/05 22:40:25
こんなんで再帰使う方がアレだわ

518:508
08/10/05 22:41:45
よく見たらバグってんなこれ

519:デフォルトの名無しさん
08/10/05 22:55:13
>>514
適当にinternal staticなクラス作って入れとく
よほど汎用的で便利なものでなければプロジェクトごとに書き捨て

520:デフォルトの名無しさん
08/10/05 22:58:44
倹索とかで見つからなかった場合null帰すのとエラーはどっちがいいの

521:デフォルトの名無しさん
08/10/05 23:00:22
場合による
「検索」という意味合いのメソッドなら例外は投げない方がいいかも

522:デフォルトの名無しさん
08/10/05 23:00:59
>>514
CodeProjectに登録

523:デフォルトの名無しさん
08/10/05 23:02:17
>>516
なんという関数型脳w

524:デフォルトの名無しさん
08/10/05 23:06:52
この問題結構奥深いな…
最小値、最大値のセットだけでなく
2番目、3番目、そして一番多くはいってる数とか
だそうとして、
ヒストグラムに一旦入れて、やってみてたけど、朝までかかり
そうなかんじなんで、つかーれたのでエロみてくる。

525:516
08/10/05 23:14:49
おまえらバカだから答え教えてやるよ

まず、配列をList<>に入れる
その後。Sort()
あとは言わないでもわかるな?

526:デフォルトの名無しさん
08/10/05 23:18:27
>>521 そもそもnull使えない型とか…

527:デフォルトの名無しさん
08/10/05 23:25:43
null許容型もだめな型ってあるの?
あるいはDictionary.TryGetValueみたいに可否と結果を別に表す方法もあるし。

528:デフォルトの名無しさん
08/10/05 23:26:18
>>525
List<>に入れるときはforを使わず再帰処理を使うんですね
わかります

529:デフォルトの名無しさん
08/10/05 23:28:44
数字なら最大値でも返えせば

530:516
08/10/05 23:31:09
要素から最大値を抜き出す
その要素に-1を代入
また、要素から最大値を抜き出す
最初に取り出した最大値より小さい場合は
唯一の最初のが最大値

あとはわかるな?

531:デフォルトの名無しさん
08/10/05 23:32:19
タイプつかってヒストグラムできた。が馬鹿でかいものになった。
歪度とかCV、σとか無意味につけてしまった。

532:デフォルトの名無しさん
08/10/05 23:37:56
ダメだ、俺の頭では、-1を代入のところがよくわからん。。。
整数だからマイナス数値ばっかのセットだってあるんだよね

533:デフォルトの名無しさん
08/10/05 23:42:09
これに速度の差とかあるですか?

try
{
  int index = 0;
  for(;;)
  {
    if(name == list[index++].name)
    {
      break;
    }
  }
  return list[index];
}
catch(ArgumentOutOfRangeException)
{
  return null;
}

//int count = list.Count;
//for(int i = 0; count > i; i++)
//{
//  if(name == list[i].name)
//  {
//    return list[i];
//  }
//}
//retnrn null;


534:デフォルトの名無しさん
08/10/05 23:45:08
>>533
foreachのほうが早い

535:デフォルトの名無しさん
08/10/05 23:52:39
516は突っ込んだら負けなんだろうか

要素は全部0以上とか元の配列を破壊してもいいとか勝手な条件付けすぎ

536:デフォルトの名無しさん
08/10/05 23:53:23
>>530
最大値が負の数だったら?

537:デフォルトの名無しさん
08/10/06 00:00:40
エレガントな解はまだかーい?

538:デフォルトの名無しさん
08/10/06 00:08:52
>>535
>>536
屁理屈言うな

あくまで>>505の規格に即しただけ

誰が符号付整数なんて条件出したんだ?

539:デフォルトの名無しさん
08/10/06 00:11:54
元々の質問は>>499でそ

540:デフォルトの名無しさん
08/10/06 00:12:05
いや、499時点で負数出てきてるし…

541:デフォルトの名無しさん
08/10/06 00:18:21
組み紐群ならったときに、エレガントな方法あったきがする。。。
が教科書すら全部研究室おいたまま10年以上たっとるな。

542:デフォルトの名無しさん
08/10/06 00:36:00
ApplicationExceptionじゃなくて
ArgumentOutOfRangeExceptionとか
InvalidOperationExceptionとか
中の人以外が勝手に使ってもいいの?

543:デフォルトの名無しさん
08/10/06 00:46:30
真面目な話、いくらふらっとスレだからって、>>499ってそんな悩む問題なのか?
そっちの方が悩ましい問題だ。
こんなのベタにやればいいだけじゃん。
間違いなく(負の数について簡単に説明してやりさえすれば)小学生でも書けるコードにしか思えないんだが。

544:デフォルトの名無しさん
08/10/06 00:47:13
>>542
ApplicationExceptionは黒歴史になりました

545:デフォルトの名無しさん
08/10/06 00:51:22
>543
小学生でも書けるかもしれないが、万人が使いたくなるような
汎用的なもの、もしくは、ロジックがみためにも美しいもの
をつくるのは、難しいぞ。

そんなに簡単に書けるコードだというのなら、手本をみせてほしい。
ヒストグラムに入れるという方法が私には、なるほど!と思わせてくれた。

546:デフォルトの名無しさん
08/10/06 00:57:52
>>545
何を言っているのか意味がわからん。
汎用的?
汎用的かどうかがコードの書法によって変わるとでも言うのか?w


547:デフォルトの名無しさん
08/10/06 01:02:27
振る舞いが重要であり、内部の構成には興味ありませんね
>>545は概念から学べ

548:デフォルトの名無しさん
08/10/06 01:04:26
証明の結果よりも、証明の仕方に興味があるタイプです。

549:デフォルトの名無しさん
08/10/06 01:06:42
なら数理論理学でも学べよ
C#とは関係ない

550:デフォルトの名無しさん
08/10/06 01:13:31
>>548
それ自体はいいと思うんだが、だからといって三平方の定理レベルの話題で
悩むのはヤバいだろう。

551:デフォルトの名無しさん
08/10/06 01:17:20
三平方の定理=立方体の体積の出し方だと思った俺の居場所は

552:デフォルトの名無しさん
08/10/06 01:22:04
乱数なんてらんだむっぽいのがでりゃいいんだよ。
メルセンヌツイスターなんていらんわ。

553:デフォルトの名無しさん
08/10/06 01:25:34
C#ってなんでメソッドの引数でデフォルト値を廃止してしまったんですか(´・ω・`)?

554:デフォルトの名無しさん
08/10/06 02:16:15
>>553
メソッドオーバーロードで解決できるから
この質問いつも出るからテンプレに入れないか?

555:デフォルトの名無しさん
08/10/06 02:18:06
>>554
C++もメソッドオーバーロードは実装してません?

556:デフォルトの名無しさん
08/10/06 02:21:44
関数オーバーロードでデフォルト引数が表せるのだから
デフォルト引数なんていう分かりにくいものは使わないようにしようという方針

557:デフォルトの名無しさん
08/10/06 03:12:09
C++作ったBjarneも多重定義があればデフォルト引数なんて構文糖、みたいなことを自著に書いていた気がする。

558:デフォルトの名無しさん
08/10/06 03:46:50
デフォルト引数の方が直感的じゃないですか?

多重定義もいいですけどコードが冗長になって保守・管理が面倒くさくなりそうですが・・・

559:デフォルトの名無しさん
08/10/06 08:35:26
デフォルト引数はオーバーロードで出来ても逆は無理だろ。その時点で
どっちがなんて議論じたい意味なし

それとシグニチャと呼び方もよろしくない、デフォルト引数は

560:デフォルトの名無しさん
08/10/06 08:49:34
ドキュメントの保守が面倒だったりはしないのかね
ある機能の説明がオーバーロードされたメソッドごとにあるから
必然的に重複が多くなるし

561:デフォルトの名無しさん
08/10/06 09:13:27
デフォルト引数って、使う人が結局その値を理解する必要があるからね。
単に、無い、という方が安全だよね。

562:デフォルトの名無しさん
08/10/06 10:05:26
デフォルト引数無いのがC#の最大の欠点

563:デフォルトの名無しさん
08/10/06 10:16:24
敢えて無くしたのに
それを欠点と思ってるようじゃC#は向いてないよ

564:デフォルトの名無しさん
08/10/06 10:18:40
public void foo(bool bar = true){
 ・・・
}
で済むところを

public void foo(){
 foo(true);
}

public void foo(bool bar){
 ・・・
}
なんてダラダラ書くのは無駄すぎるな

565:デフォルトの名無しさん
08/10/06 10:29:43
オーバーライドすると途端にカオス

566:デフォルトの名無しさん
08/10/06 10:50:24
デフォルト引数は構造上、後ろから設定しなくてはならないし歯抜けができない。

567:デフォルトの名無しさん
08/10/06 12:42:12
文句があるならC++使えばいいじゃん

568:デフォルトの名無しさん
08/10/06 12:43:36
C++なんかもっと欠点だらけだろ

569:デフォルトの名無しさん
08/10/06 13:06:49
usingとかDisposeを多用しなきゃならん状況になると
C++ならもっと簡単に書けるのに、とか思ってしまう。

570:デフォルトの名無しさん
08/10/06 13:15:31
まそりゃ適材適所
C++の方が簡単に書けるならC++で書けばいい
DllImportだってC++/CLIによるラップだってできるんだから

571:デフォルトの名無しさん
08/10/06 13:20:35
VisualC#2008を使っています。
C#をコンソールからコンパイルする方法を知りたいです。
csc filename.cs
でよいらしいのですが、cscにパスが通っていないようです。
cドライブをcscで検索しても見つからないです。
どなたかご教示いただけないでしょうか。


572:デフォルトの名無しさん
08/10/06 13:25:26
スタートメニューに.NET 2.0 SDKみたいな項目あるだろ
それのSDKコマンドプロンプト使え

573:デフォルトの名無しさん
08/10/06 13:43:18
>572
ないです。
Microsoft Visual C# 2008 Express Edition
はあります。

普通の(WindowsXP標準の)コマンドプロンプトではだめなんですか?


574:デフォルトの名無しさん
08/10/06 13:50:10
C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe filename.cs
コンパイラのパスは環境によって違うかも分からん
もしくは環境変数PATHにC:\WINDOWS\Microsoft.NET\Framework\v3.5をついかして
csc filename.cs
とかシステム環境変数に入れたくなければ
set PATH=C:\WINDOWS\Microsoft.NET\Framework\v3.5;%PATH%
みたいなバッチファイルを用意してそれを使うとか

575:デフォルトの名無しさん
08/10/06 13:51:35
%windir%\Microsoft.NET\Framework\v?.?
にあるからなあ、検索時Windowsのディレクトリは除外してたかな。

576:デフォルトの名無しさん
08/10/06 13:55:05
標準のコマンドプロンプトからなら、vcvars32.batを実行すりゃいけるよ。
探してパス通ったとこにコピーしておいてみては。

577:デフォルトの名無しさん
08/10/06 13:57:50
>574、575
あ、ありました。Prorgam Fliesばっかり探してました。
Windowsの下だったのですか。
検索はシステムファイルは除いていたかもしれません。
ありがとうございました。


578:デフォルトの名無しさん
08/10/06 16:31:50
なぁ、クラスを作ってそこのメソッドで何らかの「閉じた」処理をさせるとき、
このメソッドは引数を取るようにすべきだと思う?
それとも必要ならクラス内のフィールドやプロパティを読めばいいわけだから
そもそもメソッドに引数なんて指定する必要も無いと思う?

579:デフォルトの名無しさん
08/10/06 18:12:14
どっちかじゃなくて、適切に使い分けろ

580:デフォルトの名無しさん
08/10/06 18:19:10
>>578
フィールドにあるものを利用するならわざわざ引数でやらなくてもいい
ほかのクラスやプロジェクトで利用するようなメソッドなら引数などを考えないといけないけどね

581:デフォルトの名無しさん
08/10/06 18:29:09
くだらない質問ですみません
VC#2008無料版をインストールしたのですが.netFramework SDKのインストールも必要ですか?
それともVC#導入時に組み込まれていますか?

582:デフォルトの名無しさん
08/10/06 18:35:03
大体は入ってる
できればMSDN Library for Visual Studio 2008 SP1を
必要になったらMicrosoft Windows SDK for Windows Vistaを

583:デフォルトの名無しさん
08/10/06 18:41:17
>>582
ありがとう

584:デフォルトの名無しさん
08/10/06 18:44:06
>>580
メソッド間の引数のやりとりだけで実現可能な場合は
わざわざフィールドにする必要ないだろうか?

いまいち変数をフィールドで表現すべきか、メソッド間の引数のやりとりですます
べきかの使い分けが分からないんだが。

フィールドってある意味一昔前のグローバル変数みたいなものだから
安易に多用するのは慎むべきだよな?

585:デフォルトの名無しさん
08/10/06 18:51:59
>>584
privateにしておけば問題ないはずだけど
多分、そのソースに必要な改良はクラスに分割することじゃないかな?

大部分のメソッドはそのフィールド変数を利用しないとするならば
そのフィールド変数は混乱の元だし、そのフィールドを必要とする
メソッドと一緒にクラス化するべき

引数を取るかどうかの判断は、そのメソッドをpublicにするかもしれない場合

586:デフォルトの名無しさん
08/10/06 18:58:12
>>585
裏を返せばそのクラスのフィールドを使わないメソッドは積極的に
違うクラスに分離していけ、ということ?

587:デフォルトの名無しさん
08/10/06 19:16:36
あん裏はやめて

588:デフォルトの名無しさん
08/10/06 19:18:29
っていうか、そもそも「普通は」メソッドの引数を省略する目的で
フィールドを使いたい、などとは思わないはず。

もしそんな欲求に駆られるとしたら何か考え方が間違ってると思うよ。

589:デフォルトの名無しさん
08/10/06 20:11:24
フィールドあれ、と神は最初にいった

590:デフォルトの名無しさん
08/10/06 20:16:53
>>586
public void Swap(int a,int b)
{
 //abの値をスワップ
}

↑ならメソッドの機能を忘れてても直感的どういう動作をするのかわかる

public void Swap()
{
 //フィールド変数のa,bの値をスワップ
}

↑これだとaとbはどういう型なのか、プログラム内でどういう意味を持つ変数なのか
毎回思い出したりしなければならない

591:デフォルトの名無しさん
08/10/06 20:20:50
メソッドもクラスもできるだけ小規模で完結した機能を持ったほうが
のちのち見返した場合わかりやすい

592:デフォルトの名無しさん
08/10/06 20:22:45
Swap(ref int a, ref int b)なら分かるけど

593:デフォルトの名無しさん
08/10/06 20:24:00
>>592
どんな釣りだよ

594:デフォルトの名無しさん
08/10/06 20:39:56
i++;と++i;どっちが速い?

595:デフォルトの名無しさん
08/10/06 20:42:27
いっしょじゃね

596:デフォルトの名無しさん
08/10/06 21:01:18
式の値を使わないならIL上で全く一緒

597:デフォルトの名無しさん
08/10/06 21:23:11
アクセスに統合Windows認証が必要なWebサイトがあり、それのテストを行うために
HTTPリクエストを飛ばしてレスポンスを拾うテストツールを作っています。
デバッグ用なので、生のリクエスト文字列を送り、生のレスポンスを拾いたいため、
TcpClientを使って、HTTPヘッダもユーザが入力できるようにしました。

そこで困っているのですが、TcpClientでの統合Windows認証のやり方がわかりません。
TcpClientで統合Windows認証は可能でしょうか?可能であればどのようにすれば良いのでしょうか。
不可能であればHttpWebRequest等の代替手段を検討しなければ行けないのですが、
統合Windows認証が可能で、ヘッダも含めた生のHTTPリクエストを設定し、生のHTTPレスポンスを
取得できるクラスのようなものはありますでしょうか。

よろしくお願いします。

598:デフォルトの名無しさん
08/10/06 21:24:25
Class追加するときって1クラスにつき1つファイル(拡張子は .cs)を用意して
そこに記述したほうがいい?それともMain()関数があるところの下につらつら
クラスを追加していってもいいんだろうか?

599:デフォルトの名無しさん
08/10/06 21:29:40
内部クラスでないかぎりは1クラス1ファイル

600:デフォルトの名無しさん
08/10/06 21:30:09
どこのJavaだよ

601:デフォルトの名無しさん
08/10/06 21:31:17
クラスが増えてくると、何がなんだかわからなくなるな
UMLとか覚えたほうがいいのかねぇ

602:デフォルトの名無しさん
08/10/06 21:38:35
privateな内部クラスを使えば結構減らせる気がする
一つのクラス内でしか使わなくて外に見せる必要もない型って案外多いよ

603:デフォルトの名無しさん
08/10/06 21:49:26
>>594 前置

604:デフォルトの名無しさん
08/10/06 21:56:32
>>603
>>596

605:デフォルトの名無しさん
08/10/06 22:00:11
垂直方向のプログレスバーきぼんぬ

606:デフォルトの名無しさん
08/10/06 22:02:58
気色悪い奴

607:デフォルトの名無しさん
08/10/06 22:04:27
>>599
どうも(*^ー゚)b

>>600
Javaって一つのファイル内にクラスをつらつら書き連ねていくの?

608:デフォルトの名無しさん
08/10/06 22:17:23
>>602
それらをツリービューで表示されるから、どのクラスがどのクラスと関連があるのかとか
わからなくなるんだよね

関連図をUML風に表示する機能があればいいんだけど
プロエディションならあるんだっけ?

609:デフォルトの名無しさん
08/10/06 22:21:45
>>597
HttpWebRequest なら CredentialCache か何か使って NTLM 認証が可能。
TcpClient を使うなら、パケットキャプチャしてやりとりを確認すれ。

でもさー。Proxy 通れないケースが多いから、インターネット経由だと
かなり厳しいと思うよ。

610:デフォルトの名無しさん
08/10/06 22:28:51
javaはpublicクラスは1ファイル1クラスで名前を合わせる必要があるが、
デフォルトスコープ(internal相当)のクラスはその限りではない。
関連のあるデフォルトスコープクラスはまとめてよい。
ただ、public enumをいちいち別ファイルにさせられるのはちとつらいね。

C#の場合はpublicなenumやらdelegateやらいろいろあるから分けてられないよ。

611:デフォルトの名無しさん
08/10/06 22:36:33
>>609
HttpWebRequestのCredentialCacheで認証して、
GetRequestStreamでStream取得してそこに書き込めばできそうですね。
ありがとうございます。

ちなみに、

>でもさー。Proxy 通れないケースが多いから、インターネット経由だと
>かなり厳しいと思うよ。

これってTcpClientに対してのコメントですか?

612:デフォルトの名無しさん
08/10/06 22:36:33
そういえばネストした型をpublicやprotectedにしたらガイドライン違反になるんだっけ

613:デフォルトの名無しさん
08/10/06 22:37:45
C#をはじめるならこの本がお勧め、って感じの入門書ってありますか?

614:デフォルトの名無しさん
08/10/06 22:39:28
C#以外の経験の有無くらいは書け

615:デフォルトの名無しさん
08/10/06 22:41:19
申し訳ない
Cが文法なら大まかに覚えてる~程度の素人です
他は無知です

616:デフォルトの名無しさん
08/10/06 22:47:11
>>594
preインクリメントとpostインクリメントのコストの違い
URLリンク(d.hatena.ne.jp)

617:デフォルトの名無しさん
08/10/06 22:50:28
>>616
スレタイぐらい見ろ

618:デフォルトの名無しさん
08/10/06 22:52:10
>>609
すいません、HttpWebRequestのGetRequestStreamの使い方を調べてみたんですが、
ヘッダも含めて、直接HTTPリクエストを書き込める訳では無いみたいですね。
デバッグ用なので、中のデータがどうなっているのかを見るのが最優先なのですが、
そういうリクエストの指定ってできないものでしょうか。


619:デフォルトの名無しさん
08/10/06 22:56:02
>>614
マイコミが初心者テキストとしてもリファレンスとしても使いやすい
マイコミが理解できるレベルならMSDNで十分だろう

620:デフォルトの名無しさん
08/10/06 22:57:12
iを使わない場合最適化されるから一緒、つまり++iが速い。

621:デフォルトの名無しさん
08/10/06 23:00:01
一緒なのに早い?

622:デフォルトの名無しさん
08/10/06 23:00:16
ImageListの全画像をまとめて1つのファイルに
書き出す(読み出す)方法はありますか?

623:デフォルトの名無しさん
08/10/06 23:03:03
>>621
「前置の時と」同じコードに最適化される

624:デフォルトの名無しさん
08/10/06 23:08:25
>>611
違う。NTLM 認証の制限。ケルベロスならいけるのかもしれんけど、
試してないからわからん。

>>618
つかさ、デバッグ用なら、なんでパケットキャプチャしないの?

625:デフォルトの名無しさん
08/10/06 23:09:10
>>622
どうまとめんのさ
複数フレームの画像ならTIFFとかGIF
単に詰め込むだけで良いなら適当なヘッダつけて突っ込んでけ

626:デフォルトの名無しさん
08/10/06 23:13:38
ZipPackageとか

627:デフォルトの名無しさん
08/10/06 23:16:08
大きめのbmpオブジェクトを作って
任意の画像をそこに貼り付けて
適当に保存すればいいんじゃないの?

628:デフォルトの名無しさん
08/10/06 23:17:41
>>590
話はややずれるけど

private int a, b;

public void Swap(int a,int b)
{
this.a = a
this.b = b
}

という書き方って推奨されている?本来は

private int a, b;

public void Swap(int _a,int _b)
{
a = _a
b = _b
}

という書き方の方が正しいのかもしれないけど・・・

629:デフォルトの名無しさん
08/10/06 23:20:59
上が推奨
下はガイドライン違反
下のように書くとすれば、フィールドのa,bの方に_を付ける
「クラス外から見える名前が最優先」

630:デフォルトの名無しさん
08/10/06 23:23:11
このスレに出てくるSwapは俺が思ってるのと全然違うんだが

631:デフォルトの名無しさん
08/10/06 23:27:42
>>624
クライアント側で想定したリクエストを送れているかということと、
あるリクエストを送ったときのサーバ側の動作をみたいので。
前者だけならパケットキャプチャで拾えば良いと思いますけど、
後者のために任意のリクエストを送れるツールが欲しいのです。


632:デフォルトの名無しさん
08/10/06 23:29:24
public static void Swap(ref int a, ref int b)
{
int tmp = a;
a = b;
b = tmp;
}


633:デフォルトの名無しさん
08/10/06 23:29:50
>>631
IIS リソキに含まれてるツールでも使えばいいじゃん。

634:デフォルトの名無しさん
08/10/06 23:34:24
KeyedCollectionのGetKeyForItemは何を書けばいいの?

635:デフォルトの名無しさん
08/10/06 23:37:31
return item.Name;みたいに
要素自身が含むキーとして使える値を返す

636:デフォルトの名無しさん
08/10/06 23:38:45
>>631
興味本位で調べただけだから外してるかも知れん。
NegotiateStreamってクラスがあるらしい。(.Net2.0から)

637:デフォルトの名無しさん
08/10/06 23:41:42
>>675 どーも

638:デフォルトの名無しさん
08/10/07 00:06:23
Object a=new Object();
Object b=a;
Object c=b;
の場合、cにはaの値のアドレスのコピーを持っているbの値が代入されるということですか?
つまり、cの値を得ようとすると、コンピュータは一旦bを経由してからaにたどり着くの?
もしそうなら、コピーするほど、処理が重くなる?

639:デフォルトの名無しさん
08/10/07 00:13:03
経由しないよ

640:デフォルトの名無しさん
08/10/07 00:13:06
ならない
全部同じ

641:デフォルトの名無しさん
08/10/07 00:22:10
こっちが分かり易い。

Object ^a = gcnew Object();
Object ^b = a;
Object ^c = b;

642:デフォルトの名無しさん
08/10/07 00:24:45
>>638
ありきたりに、変数のアドレスってのを
コインロッカーのキー番号に例えると、

Object a = new Object();
の時点で、ロッカーを1箇所確保、そのキー番号を a に代入。
仮に、たとえば、そのキー番号が 5 (適当)だったとすると、

Object b = a; // キー番号 5 を b にコピー
Object c = b; // 同じく、5 を c にコピー
という状態になる。

a.Property も b.Property も c.Property も、
どれも 5 というキー番号を経由して、同じロッカーを参照。

643:デフォルトの名無しさん
08/10/07 00:51:04
>>629
> 上が推奨
> 下はガイドライン違反

マジっすか( ´・ω・)!
上が推奨だったとは・・・

毎回下の方式でやってて、 _a とか tmp_a とか名前考えるのが面倒だったんだよ。
上でいいならこれからジャンジャン this. を使わせてもらうよ

644:デフォルトの名無しさん
08/10/07 00:54:25
むしろ俺はメンバーには this. 必ず付ける派なんだが。

645:デフォルトの名無しさん
08/10/07 00:58:01
>>644
フィールドに毎回 this. つけるのって面倒だし見づらくない?

646:デフォルトの名無しさん
08/10/07 01:03:43
>>645
フィールドであることを区別する意味ではありだと思う。
それを _ つけて区別するくらいなら、this の方がタッチタイプしやすい。
アンダーバーとかの記号は打ちにくいのよね。

647:デフォルトの名無しさん
08/10/07 01:08:30
this付けるのはフィールドのみ?
メソッドやプロパティにはどうする?

648:デフォルトの名無しさん
08/10/07 01:16:21
フィールドにアクセスするときにわざわざthis.を頭に付けることなんて推奨されてたか?

649:デフォルトの名無しさん
08/10/07 01:18:33
俺はつける。

650:デフォルトの名無しさん
08/10/07 01:20:15
お前の話なんてどうでもいいんだ黙ってろ

651:デフォルトの名無しさん
08/10/07 01:21:14
>>638
もしその考え方が正しいとするならば、

Object a=new int[] {1,2,3};
Object b=a;
Object a=new int[] {4,5,6};

このときにbの値を得ようとしてint[] {4,5,6}を取得することになるよ?
んな馬鹿な話あるわけない。
つーか上記のテストコード書いて試したらすぐ確認とれるだろ。

なんでも質問するようではプログラミングなぞ向いていない。
これくらいの疑問なら自分の頭使って自力で解決できないとちと厳しいぞ。

652:デフォルトの名無しさん
08/10/07 01:24:48
>>639-642
ありがとうございます。
ずっと疑問だったんで気になってました
高級言語になるほど、内部がどうなってるか見通し利かないでうよねぇ

653:デフォルトの名無しさん
08/10/07 01:26:42
全部付ける派の人は
継承されたメンバにアクセスするときもthis付けるのかな
それともbase?

654:デフォルトの名無しさん
08/10/07 01:32:14
>>651
それの場合新しいインスタンスを代入しているんだから
bの値を得ようとするわけないのはバカでもわかります

というか、テストコードってどう書くんですか?
cに入っているアドレスが、aの値のアドレスかどうかなんて
あのプログラム動かしただけではわからないはずですけどね

参照の「コピー」というぐらいだから、コピー用に新しくメモリが割り当てられているのでは
と思ったのが勘違いです。だから、cにはaの参照がコピーされたメモリへの参照のコピーと思ったしだいです

655:デフォルトの名無しさん
08/10/07 01:36:54
これは参照です的な目印がないからな~

656:デフォルトの名無しさん
08/10/07 01:47:44
struct Vector
{
public double X, Y, Z;
public double Length
{
get
{
return Math.Sqrt(X * X + Y * Y + Z * Z);
}
set
{
//現在の長さを取得
double lng = this.Length;

//成分を変更する
X *= value / lng;
Y *= value / lng;
Z *= value / lng;
}
}
}

サンプル用の自作ベクトル構造体
全部付ける派の人ってのはこれにも全部つけるの?
return Math.Sqrt(this.X * this.X + this.Y * this.Y + this.Z * this.Z);
とか激しくキモいんだが。

俺はプロパティとフィールドの違いを見るためにプロパティは付ける。
あとはローカル変数とフィールドの区別が必要なときにも当然付ける。
あとは付けない。

657:デフォルトの名無しさん
08/10/07 03:01:19
メソッドに参照渡しするときに、宣言だけしたパラメータを渡そうとすると

int[] a;

HogeMethod( a );

「未割り当てのローカル変数 'a が使用されました。」

てなエラーが返されてしまう。

int[] a = null;

HogeMethod( a );

とすれば問題なくコンパイルは通るんだが、これって汚くない?
わざわざnullを割り当ててから参照渡しするのはどうも無駄なステップを
踏まされているように思えて仕方がないんだが。上のようなスマートな
方法も通用して然るべきだと思わん?


658:デフォルトの名無しさん
08/10/07 03:09:10
>>657
こういう話じゃないの?
void HogeMethod(out int [] a) { a = new int [] { 1, 2, 3 }; }

int [] a;
HogeMethod(out a); 


659:デフォルトの名無しさん
08/10/07 03:10:38
最近Javaから移ってきたのですが、構造体の使い道はこんなので合ってますか?

バッチ大量データ登録時にトランザクション単位でエンティティビーン的な構造体に値を放り込む
→参照渡しでクエリ実行
→構造体はトランザクション単位でfinalyでnull設定
→パフォーマンスアップな上にメモリ節約できて(゜Д゜)ウマー

現状エンティティビーンクラスにclearメソッド用意してインスタンス使い回してますが、果たして、、

660:デフォルトの名無しさん
08/10/07 03:15:18
>>659
いろいろ勘違いしている。Javaと同じでほとんどのケースでクラスを使うことになる。

661:デフォルトの名無しさん
08/10/07 03:19:57
>>658
ああ、出力パラメータを指定するという方法もあったね。
でもメソッドを呼び出すときも

> HogeMethod(out a);

"out"キーワードを付けないといけないんだよね。
呼び出すときくらい"out"キーワードは無視させてくれてもいいと思うんだが。

662:デフォルトの名無しさん
08/10/07 03:22:57
>>659
.NET Framework 開発者ガイド
クラスまたは構造体の選択
URLリンク(msdn.microsoft.com)


663:デフォルトの名無しさん
08/10/07 03:28:59
660 662
ご教示ありがとうございます。
構造体はあまり使わない的な文献はよく見かけたのですが、初見なものでなんか使い道あるのでは、と考えましたが、まだ修行がたりないようでしたね、、。

664:659
08/10/07 03:50:03
連投すみません。
659の問題点は

・エンティティビーンで16バイト以下は現実的でない
・スコープ抜けたら勝手に解放されるのでnull設定は不要
・パフォーマンスとはそもそも関係ない


で合ってますでしょうか?

665:デフォルトの名無しさん
08/10/07 06:13:16
>>633
WFetchでしたっけ?
あれはSJISのみ対応だったかと思うのですが。
UTF8なのです

666:デフォルトの名無しさん
08/10/07 07:23:11
>>665
いろいろと制約が厳しいな。

HttpWebRequest の AddHeader でだめってことは、標準ヘッダを
ごにょごにょしたい、ってことかな?

リフレクションで一部書き換えられたようには思うけど、変に細かい技を
使うより、Tcp でちくちくやるのがよさげだね。

667:デフォルトの名無しさん
08/10/07 08:34:17
>>661
ダメ。
メソッド呼びだした先で勝手に値が書き換えられるってのは嫌われる。

C++ でも、参照渡しがあるにもかかわらず、const 参照しか使わないって人多い。
出力パラメータとして参照渡ししたいときはポインタを使う。

668:デフォルトの名無しさん
08/10/07 08:41:53
>>656
俺は全部付ける。

MS のガイドラインだと、特に this. つけるとはなってなかった気が。
でも、MS のソースコードの品質チェックツール通すと this. 付いてないと警告出た気が。

669:デフォルトの名無しさん
08/10/07 08:49:17
あっ、ごめん、668 の最後の行は気のせいだった。

今やっとツールの名前と使い方思い出して試してみたけど、
付けても付けなくても文句言われない。
ちなみに、StyleCop ってやつ。
URLリンク(code.msdn.microsoft.com)

670:デフォルトの名無しさん
08/10/07 08:56:25
thisが必要なとこ以外にばらまかれてると
かえって見づらい気がするのでつけないな

671:デフォルトの名無しさん
08/10/07 08:57:47
.NET的にマウスホイールをカーソル直下のコントロールに送るのって、プロパティとかあるの?
MouseEnterでフォーカス移す以外であれば教えて(涙。

672:デフォルトの名無しさん
08/10/07 08:58:20
>>661
むしろ無いと怖いでしょ


>>664
>null
基本的に値型にnullは入れられません
Nullableを利用するとNullにできるけど…

>パフォーマンス
GCのスキャンコストが減ります
用途によってはボクシング/アンボクシングでかえって遅くなることもあります

と、これ以上はよくわからん
パス

673:デフォルトの名無しさん
08/10/07 11:04:56
>>661
そういう意味で参照渡しを前提とするパラメータには必ずrefかoutか付けないと
コンパイルが通らないようにすればいいと思ってるんだがC#はそうはなってない
んだよな。

値型の変数を参照渡しするときはoutなりrefなりつけないといけないが、参照型
の値を参照渡しするときは普通の変数のように渡せてしまう。
これじゃあとでコードを見たとき、この部分は参照渡しか値渡しなのか一目で
分からない。参照型の変数でも参照渡しするときはoutかrefを必須にすれば
よかったと思うんだがどうだろうか?

674:デフォルトの名無しさん
08/10/07 11:13:23
>>673
参照型もref/outが無ければ値渡し。参照渡しするならref/outが必要。
それに値型のなかの参照型メンバの値を変更とか考えると意味が無い。

675:デフォルトの名無しさん
08/10/07 11:28:12
C#の名称ってどうやって付けてる?どうにもVCとかVBの思考が抜けないんだが
自由なのは分かってるが一般的な付け方がしたいです

関数、プロパティ、名前空間、クラス名、定数は大文字から始める
MainForm、UpdateMenbers、LineMax
コントロールはプレフィックス(?)を付ける frmMain、btnCancel
ローカル変数は小文字から caption、changed
引数はローカル変数と同名を避けるためアンダーバーから _caption

大体こんな感じでいいのかな・・・
あと、引数付きプロパティが使えないが、Get~とかSet~ってやらないで、
インデクサ(?)付きクラスでも返した方がC#っぽい?

676:デフォルトの名無しさん
08/10/07 11:45:44
>>674
> 参照型もref/outが無ければ値渡し。

え( ´・ω・)?

677:デフォルトの名無しさん
08/10/07 11:50:08
>>675
URLリンク(msdn.microsoft.com)(VS.80).aspx

678:デフォルトの名無しさん
08/10/07 11:52:04
参照の値渡し、参照の参照渡しといいたいのだろう。
その辺はCでもいっしょっしょ。
ポインタの指してる中身を書き換えるだけならポインタをそのまま渡せばいいが、
ポインタそのものを書き換え戻したいなら、ポインタのポインタを渡さないといけない。

679:デフォルトの名無しさん
08/10/07 11:59:31
>>678
ああ、そういう意味か。

>>673で言いたかったことはメソッドに値を渡すとき、その値をコピーして
元の値は書き換えないのか、それとも書き換えるのかがメソッドの宣言を
見ただけでは識別しにくいってことなんだよね。

当然この型は値型だから渡しても書き換えされないはず、この型は参照型
だから渡せば書き換えられるはず、という知識を持っておけば分かるけど、
複雑なコードになるとそこらへんをうっかり間違えてしまいトラブルの元に
なるんじゃないかなと。

だから参照渡しをするときは値型だけでなく参照型の変数でもref/outを
必須にすればよかったのにと思ったわけ。

680:デフォルトの名無しさん
08/10/07 12:01:58
え?

681:デフォルトの名無しさん
08/10/07 12:04:03
参照型の値渡しにref付けるならば
参照の参照渡しだとrefrefキーワードが必要になるな

682:デフォルトの名無しさん
08/10/07 12:08:48
>>679
普通にref/outしたい時に困るんじゃない?

683:デフォルトの名無しさん
08/10/07 12:14:15
>>681
参照型の実体(格納してる変数は単なるメモリの番地)を知ってる人には
その通りだと思うんだが、そういうことを利用者に意識させないのがC#の
利点であることを考えると値型だろうと参照型だろうと参照渡しするときは
ref/outを必須にするように決めた方がいいと思うんだが。

そして参照型をref/out無しでメソッドに渡したら、その参照型のコピーが
メソッドに渡されるようにすればいい。つまりref/outなしで参照型の値を
メソッドに渡して書き換えられても、オリジナルの値にはなんら影響が
出ないようにすると。

これでユーザーがポインタを意識する必要は100%無くなる。

684:デフォルトの名無しさん
08/10/07 12:22:05
それどうみてもただの値型

685:デフォルトの名無しさん
08/10/07 12:24:26
むしろパフォーマンスを意識してポインタを知ることになるんじゃね?
refだらけになりそうだ

686:デフォルトの名無しさん
08/10/07 12:24:37
正直その主張はconstマンセーにしか読めない。

687:デフォルトの名無しさん
08/10/07 12:25:14
なんか初心者が好きなことを書き込むスレになってきてないか

688:デフォルトの名無しさん
08/10/07 12:33:32
> 値型だろうと参照型だろうと参照渡しするときはref/outを必須
C#は実際そう。参照渡しの語義を確認したほうがいい
URLリンク(ja.wikipedia.org)

他の言語のスレでもこういう展開になることが多いんだけど
元凶はどこにあるんだろうね・・・

689:デフォルトの名無しさん
08/10/07 12:34:56
元凶はC++だろ。早く無くなればいいのに・・・

690:デフォルトの名無しさん
08/10/07 12:45:11
>>686
できるよ。
以上。
↓次の方どうぞ

691:デフォルトの名無しさん
08/10/07 13:13:11
↑なんでそんなに馬鹿なんですか?

692:デフォルトの名無しさん
08/10/07 13:32:09
>>正直その主張はconstマンセーにしか読めない。
できるよ。

意味不…

693:デフォルトの名無しさん
08/10/07 13:33:36
やっと*から抜け出せたのに今度はrefかよ
それだったら、*のほうがマシだわ

694:デフォルトの名無しさん
08/10/07 13:35:21
>>688
数値もポインタもいずれも「値」がメソッドに渡される、という意味ではC#は「値渡し」
になるんだろうけど数値が渡されるのかポインタが渡されるのかは型によって
まちまちなわけで、その違いをもっとユーザーに意識させる仕組みが組み込まれて
然るべきじゃないかなと言ったわけよ。

695:デフォルトの名無しさん
08/10/07 13:36:31
どうやって参照型を自動でコピーするんだよ
フィールド全部再帰的になめるのか?
それでも駄目だけど
そしてrefだらけになると
あほかいな

696:デフォルトの名無しさん
08/10/07 13:38:48
あと文字列(string)は参照型にもかかわらずメソッドに渡すときは全く同じ
文字列がコピーされるからメソッド内でいくらいじくってもオリジナルの
文字列が変更されることはない。

でも文字列の配列(string[])をメソッドに渡すとメソッド内での操作が
オリジナルの文字列の配列にも反映される。

ここらへんのルールの違いをもっと明確にユーザーに伝わるような仕組みを
構築すべきじゃないかな?特にC#は後発の言語なんだから。

697:デフォルトの名無しさん
08/10/07 13:45:54
そうじゃないよ

698:デフォルトの名無しさん
08/10/07 13:46:05
>>696
stringは確かに不変オブジェクト扱いだけどこの場合何の関係も無いよ
単に自分自身を操作するメソッド/プロパティが無いだけなんだから
リフレクションで値書き換えればちゃんと呼び出し元でも変更される

699:デフォルトの名無しさん
08/10/07 13:49:15
言いたいことをまとめると、

この型はメソッドに渡すと変更を受けるけど
この型はメソッドでいじくり回しても一切の変更を受けない。

こういう型が区別も無く平然と並んでいるのがユーザーの混乱を招くってことよ。
どれが参照型でどれが値型かなんて言語ごとに違って当然なんだから
それを曖昧なままごちゃまぜにしていればいつか間違いが発生する。

言語の進化というのはそういううっかりミスをなくす方向で発展していく必要が
あると思うんだよ。

700:デフォルトの名無しさん
08/10/07 13:56:00
で、変更しないならconstつけることにした言語があったよね

701:デフォルトの名無しさん
08/10/07 14:00:00
型がimmutableかmutableかをその型の前提知識無しに
コードを見ただけで一発で判定可能にするってことか?

702:デフォルトの名無しさん
08/10/07 14:06:57
>>699
値型的な扱いはintとstringだけなんだから
これを覚えるのに大した労力も必要としないだろハゲ

703:デフォルトの名無しさん
08/10/07 14:15:01
どうも >>651以降、 アフォが湧いてるようじゃのう…

704:デフォルトの名無しさん
08/10/07 14:17:16
C#だけ扱うならな。
だが現実にはC++やJava、VisualBasicと多岐にわたる言語を同時に扱うのが普通だろ。

記憶だけに頼る方式は後々重大なエラーを招く。

「てっきりstring型は呼び出したメソッド先での変更が反映されるものだと思っていました」
そう言いながら打ち上げロケットを派手に爆発させるミスが発生するかもしれない。

705:デフォルトの名無しさん
08/10/07 14:31:50
どうにも手がつけられない

706:デフォルトの名無しさん
08/10/07 15:14:53
>>699
参照型を含む値型の扱いはどうする?

707:デフォルトの名無しさん
08/10/07 15:17:57
一日でレス進んでると思ったら(ry。
Stringでも他の参照型でも動作は共通してると思うが、>704の頭の中ではどうなってるんかが疑問だな・・。
Stringクラスの編集系メソッドはすべて新たなインスタンスを返してくるわけで、実体の操作は出来ないんだが。
つまり、参照型であっても、値渡しされたStringメソッドがその先で変更されることがありえないので誤解のしようがない。
ref指定した場合、「メソッド内での値の変更=新しいインスタンスを参照」になるだけ。一貫してると思うが。

708:デフォルトの名無しさん
08/10/07 15:21:04
Stringメソッドがその先で→Stringがその先のメソッドで

709:デフォルトの名無しさん
08/10/07 15:34:56
ポインタ難しいスレにそっくりさんがいたのを思い出した
そういう人にはサンプルコード書かせると言い逃れできなくていいかもね

710:デフォルトの名無しさん
08/10/07 15:43:42
>>707
他の言語のString型も同じだと言い切れるかな?

そしてもし他の言語のString型とC#のString型が違ったらどうするんだ?
という疑問を投げかけられて、

「そりゃそれぞれ違いを覚えるしかない」

と答えたらその時点でヒューマンエラーが紛れ込む余地が誕生したと思うべき。

近代の言語が、とくにC#がこの手のヒューマンエラーを極力排除することを
念頭に新たに作り直されたことを考えるとこの点に置いてC#は不十分な言語と
言わざるを得ない。

見方を変えればいまだにC/C++時代のポインタを引きずっているとも言える。

711:デフォルトの名無しさん
08/10/07 15:47:37
何のためのCTS(共通型システム)だと思ってんだ

712:この話題にも飽きてきたが
08/10/07 16:23:06
正直その程度のリファレンスも見ない奴がマルチリンガル気取るのもどうかと思うけど(IntelliSenceで戻り値見るだけでも気付くはず)、
言語間の実装の違いや動作の相違は、そもそも無いほうがおかしい。

それより、言語内で一貫した基準があって、すべてのクラスがそれに則っていることが言語としては第一だろ。
C#の場合、引数は標準で値渡し、ref・outで参照渡し。それがすべて。そしてStringは参照型。
それを踏まえたうえで値渡しのStringが中で変更されると思うのは、参照のイメージが確立していないか、
Stringのメンバの使い方が分かってないかのどちらかじゃないか?
前者はマとして未熟。後者はウッカリというより、これから使うライブラリのリファレンスも見ない向こう見ずに思える。
皆、長文スマンな。

713:デフォルトの名無しさん
08/10/07 16:30:19
stringが参照型の値渡しなら
string[]はどうなるんだ?

714:デフォルトの名無しさん
08/10/07 16:32:48
stringは参照型の値渡し
string[]は参照型の値渡し
stringはmutable
string[]はimmutable

715:デフォルトの名無しさん
08/10/07 16:33:31
反対だ
stringはimmutable
string[]はmutable


716:デフォルトの名無しさん
08/10/07 17:10:42
class TaskMem
{
public IntPtr Ptr;
~TaskMem() { Marshal.FreeCoTaskMem(this.Ptr); }
}

[DllImport("hoge.dll")]
static extern int Foo(out IntPtr ptr); // int Foo(void** ptr);


TaskMem mem = new TaskMem();
Foo(out mem.Ptr);

とした場合、Fooから返って来てmem.Ptrに格納される間に例外が起きない事は保証されているのでしょうか?
それともCERで保護しないと駄目ですか?

717:デフォルトの名無しさん
08/10/07 17:17:25
>>714
string[]を値渡しするのとref付けて参照渡しするのとで、結果は違ってくる?
どちらもメソッドでの変更が反映されるだけで動作は全く同じになると思うんだが。

718:デフォルトの名無しさん
08/10/07 17:23:26
>>717
参照渡しと値渡しの違い分かってる?

719:デフォルトの名無しさん
08/10/07 17:26:11
わかってないだろうな。

>>717

void f1(string[] a){ a = new []{"a","b"}; }
void f2(ref string[] a){ a = new []{"a","b"}; }

f1、f2が上のように定義されているとき、

string[] b = null;
f1(b); // bはnullのまま
f2(ref b); // bは{"a","b"}になる

720:デフォルトの名無しさん
08/10/07 17:27:13
>>717
public static void hoge(string[] s)
{
s = new[] { "c", "d" };
}
public static void hage(ref string[] s)
{
s = new[] { "e", "f" };
}
static void Main(string[] args)
{
string[] s = { "a", "b" };
Console.WriteLine("{0} {1}", s[0], s[1]);
hoge(s);
Console.WriteLine("{0} {1}", s[0], s[1]);
hage(ref s);
Console.WriteLine("{0} {1}", s[0], s[1]);
}


721:デフォルトの名無しさん
08/10/07 17:41:25
>>719
> void f1(string[] a){ a = new []{"a","b"}; }
> void f2(ref string[] a){ a = new []{"a","b"}; }

new演算子を使わずに

void f1(string[] a){ a = {"a","b"}; }
void f2(ref string[] a){ a = {"a","b"}; }

だったらどちらも結果は
bは{"a","b"}
にならない?

722:デフォルトの名無しさん
08/10/07 17:45:59
>>721
コンパイルエラー

723:デフォルトの名無しさん
08/10/07 17:51:00
>>722
いや、通ると思うんすけど・・・

724:デフォルトの名無しさん
08/10/07 17:57:10
はぁぁあ?

725:デフォルトの名無しさん
08/10/07 17:57:41
string[] a = { "a", "b" }; //おk
string[] b;
b = { "a", "b" }; //だめ

new[] を省略できるのは変数宣言の時だけだな
ちゃんとコンパイルして試してから言ってるのか?

726:デフォルトの名無しさん
08/10/07 17:58:54
どのバージョンで通った?

727:デフォルトの名無しさん
08/10/07 18:00:41
それにnew[]を省略できるのは構文糖みたいなもんで
入れたり入れなかったりで挙動が変わるなんてこたあないんじゃないかな

728:デフォルトの名無しさん
08/10/07 18:04:31
なんかねえ
初心者を装ったものすごく巧妙な釣り師というか荒らしが常駐してる気がする

729:デフォルトの名無しさん
08/10/07 18:08:58
該当人物は置いといて、どこまでが初心者として受け入れられるかって難しいぞ
質問するほうだって、これは知ってます、それも知ってますって一々言うわけに行かないし

730:デフォルトの名無しさん
08/10/07 18:10:25
virtualは遅い?

731:デフォルトの名無しさん
08/10/07 18:11:06
>>716
SafeHandle使えば悩む必要なかろ
outなら大丈夫だったとは思うが覚えてない

732:デフォルトの名無しさん
08/10/07 18:11:54
まあなんだ、初心者はstructやref/outには手を出さないことだね

733:デフォルトの名無しさん
08/10/07 18:42:37
しかし、平日の昼間からこんなところでレスしてる人ってどういう人なんだろ。
いや別に他意(<=なぜか変換できない)はないんだけど。

734:デフォルトの名無しさん
08/10/07 18:49:45
職場での息抜きに。
自由な職場っていいよね。

735:デフォルトの名無しさん
08/10/07 18:53:00
モノさえ仕上げりゃエロゲしようがアニソン垂れ流そうが自由よ。

736:デフォルトの名無しさん
08/10/07 19:07:42
>>732
鉄は熱いうちに打てじゃないが、structとemunは若いうちから慣れておいた方がいい。
なまじstructやemunを使わなくてもプログラムが書けてしまうだけに。


737:デフォルトの名無しさん
08/10/07 19:12:19
classは案外早い GCも含めて
わざわざstructを使う意義はほとんどない

738:デフォルトの名無しさん
08/10/07 19:15:11
ま、よほどタイトな処理内で使う場合じゃないと大して変わらんわな

739:デフォルトの名無しさん
08/10/07 19:16:56
無論状況によってはかなり変わるが、大抵は使い分けるデメリットのが大きい

740:デフォルトの名無しさん
08/10/07 19:27:40
>>737
ref/out使わずに結果を取り出したいならstructも少しは役に立つんでね?

741:デフォルトの名無しさん
08/10/07 19:33:34
>>739
言ってる意味が分からない。
いくらふらっとスレでもトンデモなことを言いすぎだろう。

使い分けないデメリット、なら話もわかるが使い分けるデメリットってどういう意味だよ。

あるいはどちらでも用が足りる用途なら迷わずクラスを選べ、
というのなら正しいし理解もできる。

だが構造体に存在意義がないかのような意見はおかしい。

742:デフォルトの名無しさん
08/10/07 19:55:10
俺は>>739じゃないが「それがstructかどうか」を意識しなきゃならなくなるのは苦痛だ
PointやRectangleをいちいちnewしなきゃならんのは実に面倒くさい
しかしform.Location.X = 100;みたいな記述を可能にするためには
Pointに親への参照が必要になってしまいかねないんだよな
なかなか難しい

743:デフォルトの名無しさん
08/10/07 19:57:51
enumイラネってWin32SDKみたいな定数の溢れたカオスワールドがイイって事?

744:デフォルトの名無しさん
08/10/07 20:06:08
つーかお前らほどのアニソンマスターなら放送される曲全て持ってるんだろ
公共ラジオで丸一日垂れ流しする意味ねーじゃん

745:デフォルトの名無しさん
08/10/07 20:06:58
>>742
まあPointにイベント(XChanged)を追加することでも可能だと思うけどね。

746:デフォルトの名無しさん
08/10/07 20:28:06
どとねとの構造体ってinteropでAPIとのやりとりのためにあえて残した
もんだと思ってた。win form のrect とかpointが構造体なのはwin32の
ラッパだからしかたねーんだなと 勝手に思っていた…。


747:デフォルトの名無しさん
08/10/07 20:31:52
書き方が悪かったが、使い分けなきゃならないデメリットというのか、
構造体特有の注意点とか意識しないといけないとか、
そういう点をデメリットって言ったんだよ。


748:デフォルトの名無しさん
08/10/07 20:37:29
巨大な構造体使う奴とか見たもんでな。
基本的に使うな、の方が無難なことが多い。
ちゃんと分かってる奴だけが使うならいいが。


749:デフォルトの名無しさん
08/10/07 20:40:18
メソッドいらない場合structだと思、

750:デフォルトの名無しさん
08/10/07 20:42:00
>>749
Cから来た人たちが引っかかる罠なんだよね。
ユーザー定義の値型にstructのキーワードを当てはめたのが失敗だったといわれている。

751:デフォルトの名無しさん
08/10/07 21:05:16
全然話の流れが分かってないけど、こういう使い方って問題無い?
こうしろよってのがあれば教えて下さい。

private List<Data> list = new List<Data>();
struct Data
{
    public string Key;
    public string Value;
}

752:デフォルトの名無しさん
08/10/07 21:07:46
>>750
そんな穴に落ちる奴はいないだろ。
入門者を斜め読みしただけで別物と普通は分かるよ。

「参照」って言葉の意味がC++と似てるけど別物だったりするのが落とし穴というのならわかるが、
構造体で引っかかる人間なんていないと思う。

753:デフォルトの名無しさん
08/10/07 21:10:10
struct Data
{
public readonly string Key;
public readonly string Value;
}

こうすべきじゃないかな

クラスまたは構造体の選択
URLリンク(msdn.microsoft.com)

754:デフォルトの名無しさん
08/10/07 21:15:23
リンク先の「変更できない。」という特性を守る場合
KeyやValueの値が可変なら、というか、readonlyだと駄目な状況では
構造体じゃなくクラスを使うべきなんですかね。
Listにクラスを放り込む場合どう書けば???


755:デフォルトの名無しさん
08/10/07 21:25:26
class Data
{
public string Key;
public string Value;
}
こんな感じのクラスを用意して
Data data = new Data();
で初期化して使う感じでしょうか?

756:デフォルトの名無しさん
08/10/07 21:31:58
ジェネリックなコレクションにstructを使う場合の注意としては、
IEquatable<T>.Equals(T o)と、大小比較する場合はIComparable<T>.CompareTo(T o)を実装すること。
そうしないと比較のたびにボクシングが頻発して悲惨なことになる。
もっとも基本配列であるListの場合はあまり問題ない。
実装しないなら非ジェネリックのコレクションの方が効率がいい。
登録時ボクシングは1回だけですむ。

757:デフォルトの名無しさん
08/10/07 21:51:59
>>745

そんなことしたら使い方によってはおっそろしく遅くなるよ

758:デフォルトの名無しさん
08/10/07 21:58:05
>>755

[TypeConverter(typeof(Design.DataConverter))]
struct Data : IEquatable<Data> {
 public string Key { get; set; }
 public string Value { get; set; }

 public override int GetHashCode() {...}
 public override bool Equals(object obj) {...}
 public bool Equals(Data alt) { ... }
 ...
}

namespace Design {
 class DataConverter : TypeConverter { ... }
}


759:デフォルトの名無しさん
08/10/07 22:00:44
>>758
構造体に自動プロパティを使うのは良くない
コンストラクタ書けなくなる

760:758
08/10/07 22:01:42
そいやそうだな、ごめん

761:デフォルトの名無しさん
08/10/07 22:06:00
>>757
さすがに意味がわからない突っ込みだ。
そもそもパフォーマンスが重要な場面に適合的なケースの話はしてないと思うんだけど。

762:758
08/10/07 22:07:04
ん、いや、>>759 は正確じゃないな
こうすれば書ける。自動プロパティやめとけは同意

struct Data {
 public Data() : this() { ... }
}


763:758
08/10/07 22:08:37
ああもう、

struct Data {
 public Data(string key, string value) : this() {...}
}



764:デフォルトの名無しさん
08/10/07 23:28:02
>>751って以下と変わらない気がするのですが、それでも
>>763みたいにするべきなのでしょうか。
private List<KeyValuePair<string, string>> MainList = new List<KeyValuePair<string, string>>();

そもそもがstring同士なので大小比較なども行わないし、私の頭では
どうするのが一番良いのかイマイチ理解できない…orz

765:デフォルトの名無しさん
08/10/07 23:46:17
>>764
・IL 上はだいぶ変わる(バイナリ互換の問題)
メソッドコールかフィールドアクセスになる
コード互換で言えば、ref で渡せるかどうか程度かな

・リフレクションもだいぶ変わる(バインディングで問題)
var props = TypeDescriptor.GetProperties(typeof(Data));
var prop = props["Key"];

・パフォーマンスかなと考えてもメンバ string だし

まとめると、少しでも変更に耐性のあるプロパティにしとけ
みたいな。というかフィールドにする意味ないなぁと
フィールドのほうが「あえて」立場なんだよ要するに

>>758 の例は struct 作るときに標準的にやっといたほうが
いい処理が含まれてる実装ですなただの

KeyValuePair 使うかどうかはそれ(表現したい対象)が
KeyValuePair の機能しか将来的にも持たないんなら
それでいいんじゃね

766:デフォルトの名無しさん
08/10/08 00:04:34
>>719
で引数がList<T>にしてみたんだけど

void hoge( ref List<int> a )
{
List<int> a = new List<int>();
}

767:デフォルトの名無しさん
08/10/08 00:05:54
失礼。

void hoge( ref List<int> a )
{
List<int> a = new List<int>();
}

としてコンパイルしてみたところ

ローカルの変数 'a' をこのスコープで宣言することはできません。
これは、'親またはカレント' スコープで別の意味を持つ 'a' の意味が
変更されるのを避けるためです。

というエラーが返されてしまった。
ref→out
に変更しても同じエラーが返される。
なにかまずいことでもしちゃったかな?


768:デフォルトの名無しさん
08/10/08 00:08:21
参照渡しが値渡しがどうのとか考えるレベルにすら達してないね
ローカル変数の宣言になっちゃってる

769:デフォルトの名無しさん
08/10/08 00:09:12
>>767
{
a = new List<int>();
}


770:デフォルトの名無しさん
08/10/08 00:10:34
>>769
おっ、サンクス(;^ω^)ノシ

>>768
(´;ω;`)ブワッ

771:デフォルトの名無しさん
08/10/08 00:12:46
>>768
ちょっと言い訳がましいことを言わせてもらうとList<T>があまりにも最新の技術なもんで
手持ちの参考書に一言も触れられてないのね。暗中模索状態だからつまらないところで
ミスしてしまう(;^ω^)

ちなみに

a = new List<int>();
           ↑
この()の部分ってコンストラクタの()の名残という認識でok?

772:デフォルトの名無しさん
08/10/08 00:14:35
名残っていうか引数なしのコンストラクタの呼び出しそのもの

773:デフォルトの名無しさん
08/10/08 00:18:42
List<int>もintもStringBuilderも全部型の名前
new StringBuilder()
new List<int>()
ほら同じ

774:デフォルトの名無しさん
08/10/08 00:22:10
List<T>ってC#の短い歴史から考えると全然最新じゃないんだけど

775:デフォルトの名無しさん
08/10/08 00:26:18
C#2.0が出たのって4年くらい前だっけ

776:デフォルトの名無しさん
08/10/08 00:27:03
>>771
ナカーマ

5-6年前に独習C#買って放置→最近また始めたら
ジェネリクスやらLINQやらとんでもないことになっててもうね

777:デフォルトの名無しさん
08/10/08 00:32:32
>>773
int a = new int();
string b = new string();

もokだっけ?

778:デフォルトの名無しさん
08/10/08 00:34:20
>>777
stringは引数なしコンストラクタが存在しないので無理だな

779:デフォルトの名無しさん
08/10/08 00:44:52
FileNotFoundExceptionをToString()で書き出すと

System.IO.FileNotFoundException: 指定されたファイルが見つかりません。
ファイル名 'image\hoge.png' です。

デバッガ上での実行だと、↑みたいにFileNameが出力されるのに
実行ファイルを直接開くと無視されるのね。そんなものなの?

780:デフォルトの名無しさん
08/10/08 00:45:44
>>771
言い訳が言い訳になってないのが滑稽。


781:デフォルトの名無しさん
08/10/08 00:52:39
>>790 自分でFileName出力すれば?

782:デフォルトの名無しさん
08/10/08 00:55:00
>>779
Windowsプロンプトから起動してみたけど
そんな感じのメッセージと一緒にスタックトレースが表示されるよ

783:764
08/10/08 07:50:28
>>765
>>764の書き方だと全然>>751みたいな使い方は出来ないですね。
KeyValuePairって初期化すれば値を割り当てられると思ってました。
>>764は結局>>753と同じだという事が分かりました。

クラスにすると上手く動かないし、>>763を参考にしてみます。

784:783
08/10/08 08:46:30
何度もすいません。
最終的に、クラスにしてKey、Valueのプロパティを持ち、その都度
インスタンスを生成する事で上手くいきました。
今の使い方ではあまりパフォーマンスにも影響は無さそうですが
今後の事を考えてクラスで運用します。
また、値型、参照型の違いが何となく分かった気がします。
有り難う御座いました。

785:デフォルトの名無しさん
08/10/08 10:53:02
C#ってJAVAと同じなの?

786:デフォルトの名無しさん
08/10/08 10:54:25
釣られないぞ

787:デフォルトの名無しさん
08/10/08 11:30:38
釣られてみる
あえて言おう!違うと!
まず名前が違う!これだけでじゅうぶんだ。

788:デフォルトの名無しさん
08/10/08 11:34:19
君と私は名前が違うけど同じ人間だよねえ。

789:デフォルトの名無しさん
08/10/08 11:34:30
JavaとJ++とJ#が同じかどうかとなると哲学なのだが

790:タイマーについて
08/10/08 11:35:13
質問です。タイマーについてですが、普通のWindows.Formsのタイマーを使って
います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編) - @IT
URLリンク(www.atmarkit.co.jp)

ここに書いてあるようなバグはFramework2.0以降は解決されているようでしたが、
タイムアップのイベントが立つたびに、I/Oのメモリー消費がちびっとずつ増えていく
ようなのですが、これはバグなのでしょうか。



791:デフォルトの名無しさん
08/10/08 11:35:37
一括りにすればC#もJAVAもプログラム

792:デフォルトの名無しさん
08/10/08 11:54:12
public PerformanceCounterCategory pcc = new PerformanceCounterCategory("LogicalDisk");

private void GetLogicalDiskRead()
{
this.listView1.Items.Clear();

foreach (string s in pcc.GetInstanceNames())
{
foreach (PerformanceCounter p in pcc.GetCounters(s))
{
if (p.CounterName == "Disk Read Bytes/sec" && p.InstanceName != "_Total")
{
this.listView1.Items.Add(new ListViewItem(new string[]{
p.CategoryName,
p.CounterName,
p.InstanceName,
p.NextValue().ToString()
}));
}
}
}
}

論理ディスクのReadを調べるためにこんなコードを書いたのですが、
エラーも何も無く実行できるものの値がずっと0になってしまいます。
これは何が問題なんでしょうか?


793:792
08/10/08 11:57:49
書き忘れです。タイマーで1秒毎の更新にしています。

private void timer1_Tick(object sender, EventArgs e)
{
GetLogicalDiskInfo();
}

794:デフォルトの名無しさん
08/10/08 12:53:59
>>790
失礼しました、これはタイマーのTickイベントの中で、フォルダの存在を
チェックしていて発生していたようです。メモリの消費量がイベントのたび
に0~5バイトぐらいずつ増えていくのでなんだろうと思いましたが、タイマー
とは無関係でした。すみません。


795:790
08/10/08 12:58:04
>>794
ただ、Directory.Exists(_strDirectory)これを行うたびにI/Oのメモリが
消費されるというのは正常なのでしょうか?


796:デフォルトの名無しさん
08/10/08 13:07:58
>>792
カウンタ毎回取得してたら駄目だろ
欲しいPerformanceCounterを保持しておく

797:デフォルトの名無しさん
08/10/08 13:13:48
C#とJAVAってできることはほぼ同じなの?
動く環境も。

798:デフォルトの名無しさん
08/10/08 13:13:50
>>795
「I/Oのメモリ」って何?

799:デフォルトの名無しさん
08/10/08 13:41:01
質問

VC++みたいな独自のイベントってどうやって実装するんですか?。

VC++ならWM_USER以下にならない様な番号ふってWM_HAGEとか定義して
afx_msgにつけ加え定義
MESSAGE_MAPにつけ加えて
て感じだったと思うんですが
C#ではどうやるのでしょうか


800:デフォルトの名無しさん
08/10/08 13:50:58
取りあえずヘルプでイベントの項目読め


801:デフォルトの名無しさん
08/10/08 15:06:27
WindowProc直接いじるならこれかな。
URLリンク(www.atmarkit.co.jp)

802:デフォルトの名無しさん
08/10/08 15:23:29
>>796
色々と書き直してみてとりあえず動くようにはなったんですが
我ながら何をやってるのかよくわかって無いですorz
変なことやってないですかね?

private List<PerformanceCounter> prfList = new List<PerformanceCounter>();
private void Form1_Load(object sender, EventArgs e){
SetReadInfo();
GetLogicalDiskRead2();
}
private void SetReadInfo(){
foreach(string s in pcc.GetInstanceNames())
{
if (s != "_Total"){
PerformanceCounter p = new PerformanceCounter("LogicalDisk", "Disk Read Bytes/sec", s);
prfList.Add(p);
}
}
}
private void GetLogicalDiskRead2(){
this.listView1.Items.Clear();
foreach (PerformanceCounter x in prfList){
this.listView1.Items.Add(new ListViewItem(new string[]{
x.CategoryName,
x.CounterName,
x.InstanceName,
((long)x.NextValue()).ToString()
}));
}
}

803:デフォルトの名無しさん
08/10/08 16:32:30
つぎのようなメソッドを定義し、(処理1)でエラーが発生したときただちに関数を抜け出すためには
どんな方法を採用するのが推奨されていますか?GOTO文で関数の終わりの方まで一気に
飛ばすのはあまり推奨された方法ではないと聞きました。

void Hoge()
{

・・・・

tyr{(処理1)}
catch{・・・}

tyr{(処理2)}
catch{・・・}

・・・

}

804:デフォルトの名無しさん
08/10/08 16:35:03
>>803
return;

805:デフォルトの名無しさん
08/10/08 16:37:46
>>802
何やってるか分からないてのが一番まずいな

>>803
Microsoft曰く「内部実装なんてどう書こうが知らね勝手にしろ」

806:デフォルトの名無しさん
08/10/08 16:39:41
>>804
こんな感じでいいでしょうか?

void Hoge()
{
・・・・

tyr{(処理1)}
catch{・・・; return;}

tyr{(処理2)}
catch{・・・; return;}

・・・
}

807:デフォルトの名無しさん
08/10/08 16:46:29
>>806
catch{ ... ; throw ...}という手もある

808:デフォルトの名無しさん
08/10/08 17:52:56
C#ってgoto文が実は生き残ってたのかよw

809:デフォルトの名無しさん
08/10/08 18:02:31
>>808
無知なのに上から目線ワロタw

810:デフォルトの名無しさん
08/10/08 18:22:24
下向き限定なら絶対ダメってほどでもないでそ

811:デフォルトの名無しさん
08/10/08 18:24:07
switchで使えるのはいけるかもと思った。まだ使ってないけど。

812:デフォルトの名無しさん
08/10/08 18:32:26
gotoをなくしても break ラベル とか別の文法が増えるだけ。
もう大人なんだからgotoの扱いは自分で責任をもてるだろってこと。
こういう考えでgotoを残してる言語はわりとある。

813:デフォルトの名無しさん
08/10/08 18:33:41
>>807
throw・・・例外を投げるメソッドでしたっけ?
これをそこで使うことにはどういう意味があるんですか?

814:デフォルトの名無しさん
08/10/08 18:40:48
例外投げればとにかく処理は呼び出し元に戻せる
場合によるけど何も考えずreturnよりは適切かも

815:デフォルトの名無しさん
08/10/08 18:45:33
>>814
> 例外投げればとにかく処理は呼び出し元に戻せる

void Hoge()を呼び出した元にもtry&catchの構文を書いて
そこのcatchに例外をthrowするということですか?

816:デフォルトの名無しさん
08/10/08 18:46:56
↑こんな感じでしょうか?

try{ void Hoge(); }
catch(Exception e){・・・・}

↑のcatch(Exception e){・・・・}に例外をスローすればvoid Hoge()を抜けられるという発想ですか?

817:デフォルトの名無しさん
08/10/08 20:18:34
JavaのTreeSetみたいなやつはない?

818:デフォルトの名無しさん
08/10/08 20:34:29
フォルダ名とファイル名のstringを合成してファイルへのフルパスを生成しようと思ってます。

string folder = @"c:\folder";
string file = "test.dat";

string fullPath = folder + @"\" + file;

ここでもし人によってフォルダ名を
string folder = @"c:\folder\";
のように末尾に\マークを入れてしまう人がいるかもしれません。
フルパスを合成する前にフォルダ名の末尾に\マークがあるかないか場合分けする必要が
あるわけですが、C#のクラスにこのあたりの処理を自動化してくれるものはありませんか?

無ければフォルダ名の末尾に\マークがあるかないかで場合分けして対処する必要があります。


819:デフォルトの名無しさん
08/10/08 20:37:16
Path.Combineあたり
できるかは知らないけどその辺に無かったら無い

820:デフォルトの名無しさん
08/10/08 20:47:14
>>819
どうもです。調べてみますノシ

821:デフォルトの名無しさん
08/10/08 20:47:37
ユーザに見せる必要がなければ、\が幾つ並んでも問題ない。
それでも受け付けてくれる。

822:デフォルトの名無しさん
08/10/08 20:50:54
配列のラストが\\なら消す。

823:デフォルトの名無しさん
08/10/08 21:45:13
>>816
そういうこと
抜けるだけならreturnを使うけど、例外の時はthrowを使うという手段もある。
特に、その関数無いでは対処仕切れない場合とか、例外の再throwをすることがある。
string GetMessage()
{   try {...} catch (ry) {  return " tell a lie :p";} }
より
{   try {...} catch (ry) {  throw (new Exception("ごごご、ごめんなさい");} }
のほうが良い


824:デフォルトの名無しさん
08/10/08 21:47:15
>>823
それやるなら、前の例外も付けてやったほうがいいんじゃない?
catch(Exception e) {
throw (new Exception("ごごご、ごめんなさい", e);
}

825:デフォルトの名無しさん
08/10/08 21:53:09
普通のrethrowでいいよ

826:デフォルトの名無しさん
08/10/08 21:56:20
>>825
それもそうだな。ネタを考えてて変なことやっちゃったよ

827:デフォルトの名無しさん
08/10/08 22:21:57
>>797
C#とJavaって言語だけ見るとダメで、
バックについてるのが Microsoft か SUN かという違いを見ないとダメ。

SUN がクソ。

828:デフォルトの名無しさん
08/10/08 22:35:02
Linux等でも普通に動くところがJavaと違うんだよな。
だから、おれんとこでは、クライアントアプリがC#、VBどとねと
でASPXより、Tomcat-JBOSS-Apatchがまだまだ主流だ。。。
業務サーバーとなれば、どうしてもDB+Unix系がまだまだ主流で
顧客に高級感という付加価値があびせれる。
制御系は、以外とWindowsOnlyでいけること多いんでCのDLL
をC#で呼び出す系統のものを提案できるな。

829:デフォルトの名無しさん
08/10/08 22:57:47
>>828

制御の世界でも確かに.netで組む例多くなってきてるな。
ただ、制御もSWもわかる技術者をあつめるのが難しいから
IT側とコントローラ側を分離してるだけで決してwindows オンリーでいける
というわけではない。コントローラ側はむしろ組み込みの世界に近いと思う


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch