ふらっとC#,C♯,C#(初心者用) Part32
1 :
ななしぃ# :
2008/10/12(日) 15:07:41 このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
>>980 を踏んだ人は新スレを建てて下さい。
>>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。
2 :
ななしぃ# :2008/10/12(日) 15:09:52
3 :
ななしぃ# :2008/10/12(日) 15:11:43
>>1 乙
ぷらっととかいうスレを立ててる荒らしは死ね
楽しいか? しかし幼稚な奴らばっかりだな本当。
さて、こちらをお気に入りに追加して ぷらっとを削除する作業に戻るとするか
>>1 乙
ぷらっととかという荒らしの立てたスレは放置で。
質問のある方どうぞ
↓
15 :
デフォルトの名無しさん :2008/10/12(日) 16:30:14
質問です、以前のWindowsではプロセス間通信をDDEやOLEで行っていたかと 思いますが、.NETではそれに代わるものが出来たのでしょうか? よろしくお願いします。
リモーティングとかWCFとか
アセンブリ情報のタイトルと製品の違いが分かりません どのように表記すべきか ご教授ください
他のEXEのプロパティとか見てみては
例えば タイトルがVisual C# 2008 製品がVisual C# 2008 Express Edition みたいな感じとかで考えたらどうだろう ちなみにAssemblyTitle属性はXP以降でタスクバーボタンのグループ化したときにも表示されたりしたはず
つまりタイトルはタイトルバーに表示されるべき範囲の名称に留め、製品はそれを個と見なした場合の製品名ということですね!わかります!!
タイトルに2バイト文字列使うってプログラマとしてどうなの?
突っ込む奴が馬鹿だと笑えない。 「2バイト文字列」っていつの時代の概念だよ。
Windowsの人たちはUTF-16LEBOMありのことを 昔からの慣習を引きずってUnicodeとか言うので 2バイト文字列って言ってくれたほうが正直ありがたい サロゲートペア?シラネ
今時2バイトだの3バイトだの言ってる奴プログラマ(の重鎮だと思ってる)人としてどうなの?
文鎮としてはどうでもいい
System.Stringは2バイト/文字だから(例えASCIIの範囲内でも)タイトルに使ってはいけないということですね
サロゲートペアと組み合わせ文字わすれんなカス
byte配列からデータを抜き出して使用する場合って、みんなどうしてるの? CやC++だと構造体のポインタにキャストしてアクセスすれば、 間にデータが追加になっても変更が楽なんだけども 調べたらC#でもunsafe fixed使えばキャストできるけど、これが常套手段だとは思えないし、 インデックス値を直に指定してアクセスなんてしたら、データの追加削除が発生したら 変更が大変すぎる そもそもキャストなんてしないように思えるんだけど、良い方法が思い浮かばない
日本語でおk
30 :
デフォルトの名無しさん :2008/10/13(月) 09:46:21
>>28 Marshalクラス使うんじゃね
Marshal.Copyでbyte[]からIntPtr取って、Marshal.PtrToStructureで帰ってきた
のを構造体にキャストするんじゃないかとおもうが……
外してたらごめんね
>>28 BinaryReader, MemoryStream 使う。
>>28 配列の長さにもよるけど、簡単ならBitConverter、少し複雑ならBinaryReaderかな
33 :
デフォルトの名無しさん :2008/10/13(月) 19:57:27
文字列stの中に1320があるのであればAを実行するというプログラムをかこうとしているのですが int.Parse(stArray[0])のところで止まってしまいます int code = 1320; string st = "1320,野田,め組,578954"; string[] stArray = st.Split(','); if (int.Parse(stArray[0]) == code) { Console.WriteLine("1320あり"); } codeをstringに変更し if (stArray[0] == code)にすると問題ないのですが 数値として比較したいと思っています いろいろと調べたのですが私の調べる力が足りないのか解決方法が見つかりませんでした どのようにすれば上手くいくのか教えていただけないでしょうか
それで動くと思うよ。エスパーを待ってもいいけど どう「止まる」かを具体的に書くといいかもしれない エラーが出るならそのメッセージとか
>>33 要はそのコードなら止まらないが、st = "Hoge,野田,め組,578954"とかだと
int.Parse(stArray[0])の呼び出しで例外が発生する。
それを回避するために
int.TryParse(stArray[0],out value)
こっちを使うといい。
>>33 教師やっててそんなこともわからないのかよ
のだめ知らんのか
みんなsprintfを自作して使っていると思う。俺は、へたれだから、Formatでいやいや逃げてきている。 ここらで、便利なsprintf もってる椰子がいたら公開してはくれんだろうか。
普通にstring.Formatのほうが便利
まじですか。c++が長すぎて、なんか直感的じゃないんだよな。
Stringってかかなきゃいかんのがめんどいよなあ
俺も、MSDNの文字列化の書式指定辺りが訳わかめだし。 正規表現も思ったように指定するのがめんどいんで、 sprintf,sscanf互換の関数が欲しい。
string.Sprintf()でもいいから、欲しいくらいだよ。 それか、perl, ruby風の文字列表記。
なんかねえ 慣れろとしか言えん
わからないから戻せっていうんならずっとCやってれば
C#のほうが高尚だとおもってる奴がまたでたな。
ほとんどは型指定なしの{0}ですむんだから、難しく思えるのはどのあたりだろ? 整数とか実数のことをいってるのかな。前詰め後ろ詰めのこと?
使い方なんて、わかんないとこないとおもうし、わからなかったら調べるだけ。 問題なのは、 直感的に最終的な文字列がわかり難い ことだとおもう。 無駄に長い記述になるし。
俺は、%02X 相当のことするのにだいぶヘルプを探しまくった。 結局、精度指定子とやらが文章中に埋まってるのをようやく発見したが、 あんな仕様書は俺が上司だったら却下だな。 同じヘルプのsprintfとかの方が全然読みやすいのに。なんだあれは。
そういう話なら慣れの問題としかいえないね。 あとはマニュアル(MSDN)の記述がよくなくて探しにくいというのが大きいかも。 { 位置情報 [[ , 総桁数] : 型[[0]サイズ]] } 「カンマ総桁数」のあたりの書き方がどわすれすることが多いよね。
私はfontDialog1で選択されたフォントをtextBox1に適用しようとしています private void fontDialog1_Ok(object sender, EventArgs e) { textBox1.Font = fontDialog1.Font; } これで何も変化がありません エスパー助けてください
if (fontDialog1.ShowDialog() == DialogResult.OK) { textBox1.Font = fontDialog1.Font; } じゃだめなのか?
適用ボタンでもいけた。呼ばれてないんじゃない?
55 :
52 :2008/10/14(火) 01:40:37
>>53 思い通りの動作になりました有難うございます
Okというイベントが無いみたいで呼ばれてなかったです 小生Applyでは簡単に反映は出来ていたんですが、適用ボタン表示したくなかったのでOKボタンで反映させる方法が知りたかったのであります
なるほど、自前で無理やり用意したのかw
Media Player Classicのような再生プレイヤーを作るのって難しいでしょうか? デコードはxdivなりffdshowなり各自インストールしてもらってそちらに任せるとして、 あとは映像を指定の領域に再生させたり、一時停止させたり、シークバーで任意の 場所に移動できたり、音量を変えられれば満足なんですが・・・ もしこれらの機能を実装するとしたらどんなことを勉強する必要がありますか?
過去の遺産だが俺ならDirectShow
いろいろと問題も多いけど、AudioVideoPlaybackを触ってみるのもいいかも。
61 :
58 :2008/10/14(火) 14:16:19
どうもです。 目指すのは本当にシンプルで再生負荷が極めて軽いプレイヤーです。 8年前のPCでH.264といった動画も再生できるような軽さを追求したいと思っています。 プログラムの工夫いかんで軽くすることは可能でしょうか?
それはH264デコーダの革命が必要だろう プレイヤー関係ないと思うけど
こんな質問してる奴が作れるのかね
64 :
デフォルトの名無しさん :2008/10/14(火) 14:41:37
C#の開発手順?というか定石みたいなのが書いてあるWebサイトってありますか? Program.csに書いたらいいのか、新しいクラス作って書いていけばいいのか、、、など。
取りあえずProgram.cs(Main)は殆ど触らん
66 :
デフォルトの名無しさん :2008/10/14(火) 14:59:14
>>65 ありがとうございます。
そうなんですか。。。今とりあえずprogram.csの中にメソッド追加してるんですが、良い方法ではないんですね。
プロジェクト->クラスの追加
でクラスを追加して、そこにコーディングしていくのが良いんでしょうか。
もしそうなら、そのクラスをnewするのはどこが一番いいですか?
>>63 誰もが一度は通る道だろ。
お前さんだって、俺だって・・・
>>66 おまいさんに必要なのは、まず何を作りたいのかはっきりさせることだ。
次にそれを作るのに必要なクラスを考えることだ。
69 :
デフォルトの名無しさん :2008/10/14(火) 15:20:28
>>68 それをmain()の中でnewすればいいですか?
7年前のノートPC使ってるけどWMPでH.264再生してますよ この1年で何があったんだよ・・
71 :
デフォルトの名無しさん :2008/10/14(火) 16:26:24
ベストプラクティス的なものは本を買わないと無いんでしょうか? ググりまくっても、なかなかいい資料に出会えません。 初心者の道しるべがほしい・・・。
そういうのは先人のコードから学ぶのが一番だと思う。 SourceForge や CodePlex 等から適当なやつを拾ってきて読むと、いい勉強になるんじゃないかな。
メニョーストリップで一個一個のアイテムのハンドラで処理するんじゃなくて、 一箇所で受け取って、このアイテムが押されてたからこの処理。的な事はできないの?
座標しかわからないよ
できるよ
むりよ
ハンドラ一ヶ所にしたい、ということならできる。
イベントハンドラ使い廻すか。 ストリップ本体のClick拾って項目突き止めるか。
「メニョー」では無理
「メニェー」とか発音が困難になるよかマシ
3.5SP1は何時になったら完全日本語になんねん!
for文とかのループ中ではプロパティは使わない方がベター?
>>82 単純なGet/Setならインライン化されるので問題なし
インライン化されるプロパティとされないプロパティはどう区別するの?
CLRの気持ちになって考える
コントロールには処理自体に時間のかかるプロパティが多いので場合によってはキャッシュ System.Drawingも注意
スペース区切りで1行に3項目ずつあるファイルを読み、それを二次元配列に入れたいと思っています。単に配列に読む場合には、 fruit.txt 2008/10/12(日) 12:03 バナナ 2008/10/13(月) 16:25 りんご 2008/10/14(火) 12:05 みかん 2008/10/15(水) 17:06 梨 string fileName = @"fruit.txt"; string[] fruitname = File.ReadAllLines(fileName, Encoding.GetEncoding("Shift_JIS")); でよいのですが、これを二次元配列にするにはどうしたらよいでしょう。 通常二次元配列は、 string[] fruitname = new string[4,3]; のようにして設定し、りんごを取り出すには、 fruitname[1,2] でできるようなのです。 ご教示ください。
二次元配列なんて捨ててDateTimeとFruitの二つのプロパティ持ったクラスの配列にしたほうがいいと思うけどなー とりあえずReadAllLinesで読み込んで その後二次元配列を生成 読み込んだのをループで回してSplitで分割して挿入していく
普通そういうときは二次元配列じゃなくて配列の配列にするね string[] lines = File.ReadAllLines(fileName, Encoding.GetEncoding("Shift_JIS")); string[][] fruitname = new string[lines.Length][]; for (int i = 0; i < lines.Length; i++) { fruitname[i] = lines.Split(new[] {' '); }
どこからも参照されていないメソッドの列挙とかって出来ますか?
FxCop使ってみるとか
普通に考えて無理。 まあソリューション内で直参照だけでいいなら、全ての参照を検索だったかで出来る。
あごめん、それじゃ駄目なんだなきっと。 FxCopってできたっけかな?
FxCopでできるよ
あやうくgrepとか答えて赤面するところだった
>>88 二つのプロパティ持ったクラスの配列を作った場合に例えば
DateTimeだけの配列やFruitだけの配列を取り出したい場合は
for文などで新たな配列を作るしか思いつかないのですが
他に良い方法はないでしょうか。
fruits.Select(x=>x.Fruit).ToArray()
そんなのは別に二次元配列だろうがジャグ配列だろうが変わらんが まあC#3.0ならlist.Select(x => x.Fruit).ToArray()とかできるけどな
>>88 アドバイスありがとうございます。
二次元配列を生成、というところができていないので、
具体的なソースもいただけるとうれしいです。
>>89 配列の配列。そういう考え方があるのですね。
このコード、{}の対応がとれていないみたいなのですが、
Split(new[] {' ');
のところって、
Split(new[] {' '});
Split(new[] ' ');
Split(' ');
とかやってみたのですが、うまくいかず。
ところで、二次元配列にはしないものなのですか?
string[] lines = File.ReadAllLines(fileName, Encoding.GetEncoding("Shift_JIS")); string[,] fruitName = new string[lines.Length, 3] for(int i = 0; i < lines.Length; i++) { string[] tmp = lines[i].Split(); fruitName[i, 0] = tmp[0]; fruitName[i, 1] = tmp[1]; fruitName[i, 2] = tmp[2]; }
まあ使ってるうちにわかるよ そのうち気がついたら2次元配列は全く使わなくなってるから
>>88 、100
ありがとうございます。
>>96 、97、98
fruits.Select(x=>x.Fruit).ToArray()
って全文書くとどうなるんですか!?
ひょっとしてこれ、すごくスマート!?
>>101 うっ。そうなんですか。
//class Fruit { public DateTime Date { get; set; } public string Fruit { get; set; } } Fruit[] fruits = 読み込み…; string[] fruitNameArray = fruits.Select(x => x.Fruit).ToArray();//Fruitだけの配列を作成
104 :
103 :2008/10/15(水) 20:06:03
すまん上のはエラーになるね //class Fruit { public DateTime Date { get; set; } public string FruitName { get; set; } } Fruit[] fruits = 読み込み…; string[] fruitNameArray = fruits.Select(x => x.FruitName).ToArray();//FruitNameだけの配列を作成
どうしてプログラムのサンプルって動物とかフルーツなの?
string[] lines = File.ReadAllLines(fileName, Encoding.GetEncoding("Shift_JIS")); var fruits = lines.Select(x => { string[] tmp = x.Split(); return new { Date = tmp[0], Time = tmp[1], Fruit = tmp[2] }; }).ToArray(); 匿名形使ってみたり
PointとPoint、SizeとSize、同士では足したり引いたりできないの 書いたらこんな風に ポリフォニカは普通かった面白いだろ。 特に姉妹がかわいいし。
>>104 、106
これで
バナナ
りんご
みかん
梨
のみを一括して出力するには、
Console.Write(Fruit[]); //104
Console.Write(Fruit); //106
でいいと思うのですが、
問題はこの行をどこに書くかです。
どこに書きゃいいんでしょ?
109 :
96 :2008/10/15(水) 21:21:02
C#2.0環境なので、LINQ使わずに実現したいのですが方法は無いでしょうか。
>>107 意味的におかしいからできない
WPFのPointは引き算できるんだけど、位置ベクトル扱いで戻り値はVector型だったりする
byteとByteみたいに同じような型がいっぱいあるのはなんでなの?
byteとByteは同じですよ?
回答になってない なんでおなじのがあるんだよ
System.Int32 i; とかやるのが面倒だから?
まあ、よく使う型は短くないと使いにくいからな。 位置づけとしては、 byte の方は C# の組み込みキーワード。 System.Byte の方は .NET Framework の正式名称。
基本型だってのを強調するためじゃないの
プログラマとしてはどう使い分ければいいの?
変数宣言ならキーワード使ってればいい ただしメソッド名とかの場合はInt32とか使う Convert.ToInt32みたいなの
予約語の方一択。
自分は定義されてるstaticメソッドを呼び出すときはエイリアスじゃない方をつかうな Int32.Parse() Char.IsDigit() とか なんでかはわからんが
using System が使われていないときに Byte[] byteStream; とかやるとByte何それってコンパイラに怒られるから なるべくbyteを使うようにすればいいんじゃないかと思ったり
byteはmscorlib参照しなくても使える
予約語一択が無難なんですね ありやとやんした!
理念的にはC#と.NET Frameworkは独立している(例えばintがSystem.int32じゃない C#の実装もありうる)っていうような「アリバイ作り」以上の意味はないという 認識だったんだが、違うのか?
intはSystem.Int32のエイリアスだと言語仕様できまってる
それはMSのC#コンパイラの仕様じゃないの?
たしかに
EcmaのC#言語仕様で 予約語 int は System.Int32 のエイリアスだって決まってる (Ecma 334 C# Language Specification の 11.1.4 Simple types) だからMSのコンパイラが、ってわけじゃないと思う。勘違いしてたらごめんね
たしかに
ListBoxにDisplayMemberとValueMemberを設定してKeyValuePairを 放り込んで操作しているんですが、こういうやり方と、DataSourceを 設定してそっちを操作するのでは、どちらが軽いんでしょうか。
普通は問題にならんよそんなのの差
知らないならレスしなくていいよ
すいません小数点→文字列変換時の丸めについて質問です。 double i = 1999.999999; Console.WriteLine(i.ToString("F2")); の結果が 2000.00 になってしまいます。 1999.99 にしたいのですが、勝手に丸められてしまいます。 丸められない方法はないですか?
数値を切り捨てるか、文字列にしてから切り出す、かなあ。 数値で切り捨てるのは、小数点以下2ケタなら100倍してMath.Floorとか。
>>136 グーですグー!
result = Math.Floor(result * 100) / 100;
result.ToString();
でいけました。どもです!
decimal 使うたれや
Bitmap bmp = new Bitmap("hoge.jpg"); で読み込んだ画像を png 形式のバイト列に変換したいんですけど、どうすればよいんでしょう? ImageConverter.ConvertToの引数が4つのほうを使えば良いんだろうとは思うんですが、 1, 2個目に入れるべき物がよくわかりません。 Bitmap bmp = new Bitmap("hoge.jpg"); // 実際には読み込んだ後、加工された物 ImageConverter cnv = new ImageConverter(); string str = System.Convert.ToBase64String((byte[]) cnv.ConvertTo(?, ?, bmp, typeof(byte[])));
自己解決。 ConvertToに与える加工済みのbmpは既にpng形式になってたので引数2個のほうで問題ありませんでした。
普通はMemoryStreamに対してSaveする。
>ガベージ コレクションにより、メモリ開放の煩雑さが不必要 Disposeしなくていいってことですか?
どこの文章かは分からんがIDisposable.Disposeと.NET管理下のメモリとは何の関係も無い って何回繰り返したことだろう
大事なことなので繰り返しました
>>143 それは不正確だと思うが。。
Disposeの個別の実装次第だろう。
>>145 じゃあ具体的にマネージドメモリをDisposeの実装でどうにかしてくれ
うん でDisposeの個別の実装をどうマネージドメモリに関係させるの?
例えば(Disposeに期待される役割から言って意味がないから普通はやらないけど)
巨大配列への参照をnullにする実装だってありうる。
「それはメモリを開放したことにならん」って言いたいかもしれんが、
その時は落ち着いて
>>143 を読もう。
でもやっぱり関係ないよね 参照を消しただけだもの
良く分からんが、Disposeの実装でGC.Collect()を実行するような話か?
func<T>( T t ) のように、任意の型の引数を取るメソッドがあったとして、以下のようなことはどうやればできるでしょうか。 ・引数のtが何らかの型の配列かどうか(Tが配列か否か)を取得 ・配列であれば何の型の配列か(TはT2[]の時、T2)を取得 ・配列の型(T2)が取れた場合、T2型のオブジェクトを宣言する funcの中で、 if ( t is 配列 ) { //TはT2の配列と仮定 foreach ( T2 t2 in t ) { //t2に何らかの処理 } } というようなことをやりたいと思っています。 よろしくお願いします。
普通にはできない。 foreachしたいだけなら、IEnumerable<T>を引数にしたほうがいい。
C♯ってくらいだからC言語の内容を包括してますか? あとC♯を勉強してたらJAVAやD言語についての理解も深まって いざってときにそれらにシフトしていくことも可能ですか? C♯に一番興味あるんですけど、JAVAやC言語、D言語ってのも いいってきくのでその3つにつなげることができるのか疑問です。
お前には無理
s.Close;ってなんなの 何でいちいちこんなことする必要あるの?
>>156 書いておく癖をつけとかないと、なんか色々漏れるんだよ。
理由が想像すらつかない程度の知識しかないんなら、とりあえず面倒でも従っとけ。
>>154 言語の知識だけで一人前になれるほどプログラムは単純じゃありません。
興味を持っただけの段階で知識の応用範囲を気にするなんて小賢しい真似をする暇があるなら
さっさと勉強した方がなんぼか有意義です。
でないと自分に必要な分野すら見えてきません。
>なんなの、するの? こういう言い回しする奴はとことん頭悪そうだな
名前空間 Hoge のクラス Aと、名前空間 Hage のクラス Aがあるとして、 Aは両方とも中身(フィールド・プロパティ・コンストラクタ定義。メソッドは持たないデータ格納用クラス)は全く同じで、 名前空間のみが異なるとします。 仕様上そうなっているので、クラスを一つに統一するのは難しい状況です。 このとき、HogeのAとHageのAのオブジェクトを相互変換したいのですが、何かうまいやり方はありますでしょうか? 最も愚直な方法は、メンバを全て列挙して、一つ一つ代入していくことだと思いますが、 量が非常に多いのであまりやりたくありません。 Hoge.A.BやHage.A.B等、Aの中に同様のサブクラスBがあったりして、.NETで提供されるstring等の基本的なクラスに 落ちるまで、全て展開してやる必要がありますし。 単純にasやキャストを使っても変換できないと言われますし、 XMLシリアライザでメモリストリーム上にシリアライズし、他方の型を指定してデシリアライズしても、 型が違うと怒られます。 何かうまいやり方はありますでしょうか。よろしくお願いします。
>>152 同じ名前で通常版と配列版をつくってオーバーロードすればいけると思う。
配列がobjectにキャストされてたらダメだけど。
static void Func<T>(T [] ts) { foreach (T t in ts) Console.WriteLine(t); }
static void Func<T>(T t) { Console.WriteLine(t); }
>>162 両方同じインターフェース継承させちゃダメなのか?
それがダメなら、リフレクションでやれ。
166 :
デフォルトの名無しさん :2008/10/17(金) 12:22:53
>>162 どれぐらいメンバ変数があるんだかわからないけれど、一個一個やるんじゃなくて
Hoge.Aを引数にとってHage.Aを返すメソッドを一個書けばすむんじゃねーの?
Hage.A ConvertHogeToHage(Hoge.,A a)
{
b = new Hage.A();
b.x = a.x;
b.y = a.y;
.......
return b;
}
てな具合にさ。
それが面倒だって言ってるんだろ
配列 int[] a = a[10]; があるとします。 この配列の範囲外にアクセスしようとしたら、たとえばa[-1]やa[10]にアクセスしようとしたとき、 特定の数字(たとえば-1)を返すようにすることは可能でしょうか?
無理 インデクサを実装した型を自作してそれっぽく振る舞わせることは可能 意味がわからなかったら勉強しろとしか言えない
インデクサですか、ちょっと勉強してきます。 あるいは簡単にメソッドで実現するという方法は一般的でしょうか? int a(int x) とし、0 <= x <= 9 以外の範囲を指定したら-1をreturnするようなメソッドの中に int a[]; を宣言するという方法もあるかと思いますが・・・
ま別にそれでもいいんじゃね 今なら拡張メソッドでGetValueOrDefault<T>(this IList<T> list, int index, T default)とかか やらんけど
ここ初心者用なのに初心者叩かれるよね
全然
ディスプレイ(もしくは特定のウインド)を(動画で)キャプチャし その動画をLAN内の別のPCのメディアプレイヤーで見れるようにする(WMEのような)ソフトを作りたいのですが 非常に大雑把な作成の流れですが下のような流れで作ろうとすれば作れるでしょうか? ココをこうすればいい、この部分に注意するようになどのご意見を賜りたいので書き込みました Graphics.CopyFromScreenメソッドを使用して 連続でディスプレイをキャプチャ ↓ 画像ファイルを繋げて動画へ変換しつつ httpとUDPで通信できるサーバを立てる ↓ メディアプレイヤーから接続があった場合 そこへ動画を配信する
エンコードはしないの?
エンコードしないとサイズやらなんやら大きくなってしまいますね・・ メモしておきます
WindowsMediaServiceで出来るだろん
C#の正規表現で、「スペース(半角、空白)か改行しかない」という 条件はどう表現するのでしょうか。
>>169 インデクサに関してちょこっと調べてきました。
setやgetで要素を設定・取得するわけですが、要素数が100個とか1000個になると
swich〜case文で設定していくのは大変な作業になってしまう気がするのですが・・・
意味が分からん 普通そんなのはDictionary使うだろ
私の辞書にその発想は無かったわ。
182 :
178 :2008/10/17(金) 20:13:57
^\s+\n と ^\s*$ を組み合わせる事で表現出来たような気がする んですが、間違ってないでしょうか。
>>179 なんでswitch? その発想はなかったわw
class MyArray<T> {
private T[] array;
public T this[int index] { get { 0 <= index && index < array.Length ? array[index] : -1 } }
}
184 :
178 :2008/10/17(金) 20:21:18
すいません。正規表現スレ行きます。
185 :
183 :2008/10/17(金) 20:22:17
return忘れてた setはarray[index] = value;ね
>>183 >>185 どうもです(^-^)ノ
そのsetを実装すればあとはfor文なりで配列に値を普通に格納していけるわけですね。
すみません。 配列で複数作ったクラスに継承使ったら複数の基底クラスが生成されて負担が大きくなる という事はありますか?
うぜえよお前!
C#か日本語でおk
クラスを入れる変数はポインタだからクラスの大きさとは関係ない 配列は変数がたくさん並んだものだからクラスの大きさとは関係ない
コマンドライン引数に関する質問です。 class MyApp { static void Main(string[] args) { foreach(string s in args) System.Console.WriteLine(s); } } こんな感じの引数を表示するだけの物を動かしてて気付いたんですが、 argsにはワイルドカードが展開されない状態のコマンドライン引数が入るみたいですけど、 展開済みの引数配列を得るにはどうすればよいんでしょう?
そもそも引数にそんな概念はないだろ 自分で好きなように処理するだけ
Unixのシェルには存在するらしいよ シェルだからプログラムに渡される前に展開される
ワイルドカードを「展開」するとかされるって言い回しは一般的なんだろうか
>>195 Unixシェルがやってくれるのは展開すると言われることが多いと思う。
VC++のsetargv.objみたいなのは.NETにはないのかな 自前で展開すればいいんだろうけど いかにも車輪の再発明になりそうで躊躇してしまうね
別にダメでもないが
>>198 Directory.GetFiles() がダメっていうよりシェルが展開しないとダメな理由は
ワイルドカード展開処理が各プログラムごとに異なって実装される可能性があるから。
>>200 例えばdir *\*.txtは文句言われるけど、
ruby -e"p ARGV" *\*.txtは1階層下の.txtのリストを表示してくれる、
みたいに実際に処理できるパターンが違うものがあります。
結局の所、展開処理は標準ライブラリでは用意されてないから
Directory.GetFiles, Directory.GetDirectoriesを使って自前で処理を書かないと駄目ってことでしょうか。
pythonにはパターンからそのパターンにマッチする ファイルのリストを返すglobとかいうモジュールが標準でついてた気がする そういうのがほしいのか
2つの文字列が一致しているかどうか判定するプログラムを書きたいと思っています。 string A="(文字列)"; string B="(文字列)"; とし、 if (A == B) で判定はできるかとは思いますが、たとえば比較する文字列が長い場合(2ちゃんに投稿 される平均的な1レスくらい)でもこの方法を使うべきでしょうか? それとも長い文字列の比較のためには別に推奨された方法がありますか?
>>205 予め等しいか等しくないかが分かっているのでなければ、
少なくとも一度は線形時間かかる方法で比較しないといけない。
でも、一度等しいかどうかを判断すれば、その結果を変数に保存しておくとか、
System.Xml.NameTableのような仕組みを使ったりすることで、
二度目以降は定数時間の比較で済む。
>>206 不用意な回答だと思うなあ。
まあ質問者の質問の仕方が悪いんだが。
例えばDBとか検索エンジンのようにハッシュを使う方法もありうるし、
目的を明確にせずに一概に言えないとしかいいようがないと思うんだが。
比較対象の傾向にもよるけど、例えばまず文字列長を比較するとか 基本的に数文字で一致しなくなる掲示板レスみたいなのなら普通に比較するだけでも十分だろうし そもそも比較回数が少ないなら気にすることもないだろうし
209 :
205 :2008/10/18(土) 18:07:32
>>206-208 ハッシュという方法がありましたか( ´・ω・)!
文字列をハッシュを使っていったんハッシュ値に変換してから比較するのと、
C#に標準で用意された文字列比較(==)とではどちらが短時間で済むでしょうか?
あとC#にはハッシュ関数は用意されていましたっけ?
それとも自前で構築する必要がありますか?
初心者がハッシュね うん
ちなみに==よりもString.Equalsの方が早いよ。
どういうシステムなのか次第で最適な方法なんていくらでも変わってくるんだから、 その辺を明らかにせずに聞いても仕方ないんじゃないか? たった2つの文字列を1回きり比較するだけとか、 数百万件の文字列データを高速に比較したいとかで 全然やり方なんて違うだろ。
object.GetHashCode()でハッシュは取れるが そんなこと考えず==で普通に比較すりゃいい
214 :
205 :2008/10/18(土) 18:36:28
>>211-213 プログラムは2ちゃんに投稿される1レス相当の文字列を数千回程度比較する規模です。
このくらいでしたら==やString.Equalsを使った方が速いでしょうか?
>>214 数千回と一口に言っても
一つの文字列と複数の文字列を比較する場合とか、
複数と複数を比較する場合とかで違ってくるわけだが。
やりたいことを全部書けよ。
216 :
205 :2008/10/18(土) 19:19:53
>>215 はい(´・ω・`)
比較する文字列はすべて違います。
webにアップロードされてる文字列に変更が加えられている物が無いかを
チェックするため、手元にコピーしておいた過去の文字列と、たった今web上
から落としてきた文字列を1つ1つ照らし合わせながら比較していきます。
その数が一回の処理でだいたい数千回に上るという仕様です。
それなら普通に==で比較するのでいいんじゃね。 「異なっていること」を判断するのにハッシュはあまり役に立たない。
初心者ほど何故か小出しにするから、中級者以上の回答者が混乱して無駄に議論を始める
219 :
205 :2008/10/18(土) 19:34:46
>>218 す、すいません(´;ω;`)ブワッ
>>217 そうなんですか(´・ω・`)・・・
逆にハッシュを使った文字列比較が活躍する場所は何でしょうか( ´・ω・)?
>>216 == or String.Equalsで良いと思う。
>>219 ハッシュは文字列の場合はパスワードの認証とかに使われるし、それ以外ならほとんどバイナリの整合性を取るために使われる。
>>219 保存されてる数千の文字列を総当たりで比較する場合とか。
ハッシュ作るのに相当なコストかかるから、比較の一方が1回しか
比較の対象にならないならば、効率が悪すぎる。
==とString.Equalsに違った部分があるかのような言説はなんなんだよ
224 :
205 :2008/10/18(土) 19:53:08
同じ文字列を何度も比較に使うときはハッシュにすると効率がよくなるということですね?
ちゃんとキャッシュすればね
と言うよりも、比較の際にハッシュ作成の時間をカウントしないで済むかどうかが肝なんだろうね。
つまりハッシュ値を事前に用意できるかどうか。
>>216 の場合はハッシュによるふるいわけが適用可能な例に思える。
どう考えてもハッシュを使う意味がない。 こういう場合にハッシュを使う意味がある可能性があるのは、かなりサイズが大きい場合。 つまり全文をディスクから読む負荷がかなり大きい場合。 2ちゃんレスレベルなど、ハッシュ計算の自体の方がはるかに負荷が大きい。 ディスクからの全文読み込み負荷と、ハッシュのみ読み込み負荷の差が、 ハッシュ計算自体の負荷よりもずっと大きいなら効率化できるかもしれない。 ハッシュ計算結果を全部メモリにキャッシュしとけば別だが、 2ちゃんレスレベルならいっそ文字列全部キャッシュしてもいいくらい(件数によるが数千件レベルなら)。 そこまで性能にシビアでないなら何も考えず全文比較でいい。
初心者がいきなりそんなどっちが早いとか考えなくていいです 希望する動作を実現するのに最も簡単な方法を教えてあげてください
229 :
205 :2008/10/18(土) 20:56:10
>>227 > 2ちゃんレスレベルならいっそ文字列全部キャッシュしてもいいくらい(件数によるが数千件レベルなら)。
どうもです。
スタックに
string[] A = {"文字列", "文字列", "文字列", "文字列",・・・,"文字列"};
みたいな感じで格納して計算してもいいと思いますか?
>>227 分かってるような感じでいい加減なことを言わんように
>>211 あちこちで言われてる事ではあるけど
String.Equalsの方が早いと言っても微々たる差でしかないし
とくに初心者はString.Equals(String)ではなく、誤ってString.Equals(Object)を使ってしまう危険性が高い。
その場合、stringとintの比較のように型が異なっていてもエラーが出ずコンパイルが通ってしまい、バグの発見が遅れる可能性が出てくる。(実行時に例外発生)
問題点を教えずに使わせるのは良くないと思うんだ。
このスレにはC#の未来が掛っています 初心者潰しをするか初心者を受けれるかはあなた次第
どの部分がいい加減なのかをきっちり指摘すればいいと思うんだよね。
おっと
>どの部分がいい加減なのかをきっちり指摘すればいいと思うんだよね。
は
>>230 宛てね。
a.Equals(b)って対称じゃなくて嫌い
String.Equalsでのパフォーマンスの差なんて、文字列がよっぽど短くなけりゃ完全無視できるレベル。
>>227 でいい加減なこといってると思われそうな箇所は、
>2ちゃんレスレベルなど、ハッシュ計算の自体の方がはるかに負荷が大きい。
ディスク読み込みよりもハッシュ計算の方がはるかに思いといってるように読めるかもしれない。
→ここで書いたのは文字列比較よりもはるかに重いという意味
あとは、なんだ、ハッシュを暗号関連のハッシュではなく、.NETでのGetHashCodeによる
ハッシュの意味と思われてる可能性があるのかもしれないが、GetHashCodeの値はそもそも
ディスクに永続化なんぞしちゃいけない情報なのでこういう用途にはもともと使えないから除外してる。
あとはどこかいな?
あとGetHashCodeじゃ現実的に衝突を考慮する必要も出てくるだろうから使えないしね。
>>234 ハッシュを使う価値があるのは同じ文字列を複数回比較に使う場合
代表的にはn個の文字列の中に同じものが含まれるかどうかといった場合だ
文字列が長いとどうだとか瑣末な問題を全てであるかのように語っているのがいい加減だ
Dictionary<int, List<string>> cache = new Dictionary<int, List<string>>(); int hash; List<string> sl; foreach(string str in getStrings()) { hash = str.GetHashCode(); if(!cache.ContainsKey(hash)) { sl = new List<string>(); cache[hash] = sl; } sl.Add(str); } string input = Input(); hash = input.GetHashCode(); if(cache.ContainsKey(hash)) { sl = cache[hash]; if(sl.Contains(input)) Console.WriteLine("一致"); } 205じゃないけどhash使う場合ってこんな感じになんの?
cache.TryGetValue(hash, out sl); if(sl == null) { sl = new List<string>(); cache[hash] = sl; } こうか
それだと意味無いだろ ハッシュの計算結果を使いまわさないと
>>239 んなもん今回のケースと全く合わないから触れもせんかったわ。
最初から今回のケースに関わる場合という前提で書いたから。
そういうハッシュも含めて文字列の長さが全てなんて言った覚えはない。 だいたい最初から一致判定の話あって、検索の話を書いてるのはお前だけだろう。 無論それを確認する意味はあるが、俺はあくまで用途がだいたい見えた状況以降を見て書いてる。
>>243 今回のケースなら、同じ文字列を複数回比較に使わんのだから
文字列が長かろうと短かろうとハッシュを使う理由はない
>>242 > ハッシュの計算結果を使いまわさないと
string input = Input();
hash = input.GetHashCode();
if(cache.ContainsKey(hash))
{
sl = cache[hash];
if(sl.Contains(input))
Console.WriteLine("一致");
}
の部分がループしてて何回も入力がある場合は意味があるって意味?
俺も
>>227 はいい加減なこと言ってると思う。
少なくとも結論は間違ってる。
つまりハッシュを使う意味は
>>216 のケースではありうる。
こんな説明は無用だとは思うが、ハッシュの実装はいろいろありえて、
全文比較をするより軽くてかつそれなりに使える実装は考えうると思われる。
極端な話、
>>216 の用途に特化するなら文字数(バイト数)でもいい。
キャッシュしてあるデータのハッシュ値は事前に用意できることも考慮に入れれば、
全文を比較するよりずっと軽いと思う。
>>245 やっぱり分かってないだろう。
文字列がかなり長いなら、ハッシュだけをディスクから読むことで効率化どきる可能性がある
って最初からそれを言ってるだけなのに。
それも可能性はあるって書き方しかしてないのに。
> hash = input.GetHashCode(); GetHashCode()のコストは高いので、このhashを何回も使い回すような 状況じゃなければ、直接文字列比較した方がよい、って意味。 1回比較して捨てちゃうんだったら意味ない。
C#ってネイティブコードも出せるんだっけ?
長さ比較レベルなどただの文字列比較でも最初にやってる。 そして今回のケースは違う場合を調べたいのだから、一致しても結局全文検査が必要。 暗号ハッシュなら現実的に一致は無視できるが。 暗号ハッシュじゃなくて現実的に一致を無視できるようなハッシュは作れるかもしれんが、 それは全文検査が必要だということは分かるだろう? つまり最初から全文一致検査したほうが早い。 よって、ディスクから読むなど、対象文字列の準備に負荷がかかる場合しか意味がない。 あと俺はもともと、キャッシュした場合の話も書いてる。
>>249 ほうほうなるほど、そんな重いのか
適当に数千件の文字列食わせてhash使わない実装と比較してみる
ありがと
>>251 >現実的に一致を無視できるようなハッシュ
そんなものは必要ないんだよ。
元のデータが違っててもハッシュ値が一致する確立が十分小さければ必要十分。
分かってるのかな
>>248 ハッシュを作るには長い文字列をまずディスクからとってくる必要がある
このケースでは文字列を一回しか読まないんだからハッシュを使う意味はない
>>249 Dictionaryの方のハッシュが何回も使われている
文字列の長さ×文字列数の比較が
文字列の長さ分のハッシュ値の取得になっている
ものすごく意味あるだろ
今回のケースは、それほど長くない文字列が大量に保存されていて、 最新の情報で変化があったものだけを抽出したい。 ディスクに対象の文字列がすでに大量に保存されている。 もし一つ一つの文字列がかなり長いなら、文書を保存する際にそれぞれ暗号的なハッシュを求めて ディスクに保存しておき、比較時は最新の文字列のハッシュを計算、ディスクからはハッシュだけを読むことで、 長い文字列を大量に読み込む負荷を節約できる。 ハッシュだけならそもそも事前ににディスクからすべて読み出しておくこともできる。 だが文字列が短いならそもそも全文を事前にディスクからよんでキャッシュしておけば、 いちいちハッシュ計算するよりも全文一致検査の方が早い。 だから文字列がかなり長くないと意味がない。 文字列がかなり長いなら意味がある可能性はある。
>このケースでは文字列を一回しか読まないんだからハッシュを使う意味はない 今回のケースの用途から察するに、この処理を定期的に繰り返すんだろ。 おれはその想定で書いてる。 取ってきた文字列を保存するときに、ハッシュも同時に求めて保存しておく。 変更のある文字列は一部だと俺は予想していた。 これはまあ実際には違うかもしれないな。 だからほとんどの文字列は何度も比較されるから、ハッシュを事前に求めて保存しておく意味があると考えた。 多くが変わるのなら意味はない。
>>256 >>216 >チェックするため、手元にコピーしておいた過去の文字列と、たった今web上
>から落としてきた文字列を1つ1つ照らし合わせながら比較していきます。
ちゃんと嫁
>>256 >いちいちハッシュ計算するよりも全文一致検査の方が早い
だからハッシュっていったっていろんな実装がありうるっていってるのに。。
例えば簡単な一例として、下位2バイトが文字列のバイト数、上位2バイトが文字列の
真ん中の文字の文字コードとする4バイトの値を生成するハッシュ関数でも
それなりに使えそうだし、これなら比較よりずっと軽そうなのは想像できるでしょ?
>>258 どういうこと?
俺が想定していたのはこんな感じなわけ。
数千件のデータがあり、定期的に最新のものをとりに行く。
で変わったものだけを抽出して何か処理したい。
変わっているとしてもごく一部のデータの場合が多く、全く変わっていない場合もある。
変わっていた場合は、変わっていた文字列を最新情報として保存しなおすんだと思った。
>>216 を読んでこう予想したわけだけど。
何かとんでもなく読み違えているかな?
まあともかく俺は、上のように予想して、なら文字列が長いならハッシュを利用する意味がある
可能性はあるだろうと書いた(ここでのハッシュは一応暗号的なハッシュ)。
しかし今回は文字列の一つ一つは短いらしいから意味はないと書いた。
>>259 あのな、ハッシュを計算して比較して、で、どうするわけ?
変わってるものを抽出したいんだろう?
ならそんな方法でハッシュを計算しても、一致した場合、
結局全文を一致検査しないと本当に変わってないかは分からない。
※そんなハッシュ計算じゃ一致しても本当に変わってないかチェックが必要なのはわかるだろう?
ハッシュが違った場合、確実に変わっていると判断できるが、
一致した場合は結局全文の検査が必要だろうが。
>>261 もともとハッシュというのはそういうものだから。
それでも
>>254 に書いたとおり、元のデータが違っていてもハッシュ値が一致する
確率が十分小さければ意味がある。
小学生でもわかる理屈だと思うけどなこれ。
>>259 ほとんどがガラッと変わってる前提で、変わってないものを抽出したいなら意味はあるかもしれないが、
Webの情報というと、文字列の一部だけが変わってる可能性もあると予想できる。
長さが変わってる可能性は高いだろうが、それは文字列のただの一致判定でも最初にチェックされるから、
わざわざハッシュでやる意味はない。
そういう簡単なハッシュの意味が出るとしたら、文字列の多くの場所が変わってる前提
かつ、数千件の文字列の多くが変わっている場合だろう。
おれはそんな前提とは思えなかった。
>>262 >それでも
>>254 に書いたとおり、元のデータが違っていてもハッシュ値が一致する
>確率が十分小さければ意味がある。
それには、
>>263 で書いたような前提が必要。
ガラッと変わっていない文字列でも一致の可能性を低くするには、
文字列の多くの場所を検査する必要があり、そうなるとただの一致検査に対する
パフォーマンスのメリットも小さくなる。
その上偶然一致する危険も無視できない。
無視できるほど小さくするには、文字列のずべてを使う必要がある。
まあ、ちょっとくらい違っても一致でいいやって思ってるなら、
そもそも話が合わないのでもういい。
>>264 だから無視できるほど小さくする必要なんてないんだってば。。
アバウトな言い方をすれば、一致する確率が両者の方法のパフォーマンスの比より
小さければ十分でしょ。
そしれそれがそんなに実現困難な目標とは思えん。
>>262 >
>>261 >もともとハッシュというのはそういうものだから。
それはハッシュテーブルなどで使う用途。
結局一致した場合は後できちんと一致比較する前提。
GetHashCodeなどの場合(といってもGetHashCodeも全文使って重いが)。
で、暗号的なハッシュは、現実的にそれが無視できるほど確率が低い。
もともと似た文字列で一致することがないように設計されているから。
>だから無視できるほど小さくする必要なんてないんだってば。。 >アバウトな言い方をすれば、一致する確率が両者の方法のパフォーマンスの比より >小さければ十分でしょ。 それが意味があるのは、文字列の多くが変わってる可能性が高い場合。 その場合は、ハッシュが一致することが少ないので、変わってることを早く確認できる。 一致した場合のみ、全文確認すればいいから。 でも何度もそうは思えないって書いてる。 多くの文字列が変化してないなら、多くの場合ハッシュは一致するんだから、 多くの場合に全文の一致検査が必要になる。 つまりメリットは少ない。 つうかな、長さの比較レベルまでハッシュに含めたら、 もはやハッシュの話を別にする意味ないだろ。 それは単なる文字列の一致検査の実装のチューニングだ。 多分そういう感覚でいってるんだな? なんとなく話題にしてるハッシュの前提が根本的に違うことは分かったわ。
初心者おいてきぼりのこの展開
あとな、全文一致検査でも頭から見て違った時点で検査は終わるんだから、 ガラッと変わってれ場合はかなり速い可能性が高い。 でもガラッと変わってなければ、簡単なハッシュじゃ一致する可能性が高い。 単なる長さ検査なら全文一致検査でも既にやってる。 やっぱりあんまり効果があるとは思えない。
ハッシュってのは衝突しないのが前提だぞ。 ハッシュが一致してたら一致、一致してなければ不一致とみなす。 そうじゃないと世の暗号や署名なんか成り立たないじゃないか。 んで、本題に戻ると、文字列比較なんかREPE CMPSBすりゃ一発だから、 単純比較のためにハッシュを利用する意味はない。IOを考慮するなら 確かに意味があるケースもあるような気はするが。
まあ、今の話は暗号ハッシュとそうじゃないハッシュ、さらに、不一致をざっと確認するハッシュもどきまで話に出てきてるからね。 まあさすがに長さ検査はハッシュとは呼ばんと思うが。
まあこのスレ的には 最低限の常識さえ踏まえていれば後は実際に問題になってから考えればいい
274 :
205 :2008/10/19(日) 01:33:09
>>270 ((((((;´・ω・))))))ガクガクブルブル
>>271 逆操作が難しいってのは暗号に使うハッシュ関数の特徴であるけれども、
それは衝突が起こらない/起こりにくいという意味ではない。
そもそも128bitとかそこらで、どれだけの長さの文字列が表現できると思ってるんだ。
276 :
デフォルトの名無しさん :2008/10/19(日) 02:51:10
Imageクラスに入っている画像から24bit/RGBそれぞれのbyte配列を得たいのですが、 GetPixelでは遅すぎて困ってます。 高速に処理するにはどうしたらいいのでしょうか? // Image imgを // byte[] r; // byte[] g; // byte[] b
ImageにGetPixelはねーだろ
MSはなんでgetpixelみたいな誰が見ても糞なやつを実装したんだ?
>>278 128bitの空間でハッシュが衝突しないようにするには、
どれだけの長さまでの文字列を保持できるのか、って話なんじゃね。
長さは関係ないでしょ。
同じハッシュが生成される文字列がいくらあろうが(っていうか無限にあるわけだが)、 現実に衝突発生の「確率」が低ければよい。
>>275 一般に確率的にしか衝突を起こせない場合、
十分なビット数があればそれでいい。
そして普通はそれを、衝突が発生しにくい、という。
そして、暗号ハッシュは衝突が発生しにくいのが大前提、と表現する、普通は。
逆操作が難しいだけじゃ暗号ハッシュとして使い物にならない。
コピー元の値(参照型)を変更すると、コピー先の値も変更されるようにするにはどうすればいいでしょうか。 具体的には、 class A { public string text; public A(string text) { this.text = text; } } int main() { string text = "abc"; A a = new A(text); text = "def"; Console.WriteLine(text); Console.WriteLine(a.text); } で、最後の出力がどちらも def になるような動作にしたいのです。
C#にそのような機能はありません
なるほど、無理ですか。もう一度構造見直して考えてみます。 どうもでした!
>>276 >>285 はなんでこんな変なことしてるんだろう
普通はBitmap.LockBitsを使う
まだ2003も出てない時期の記事だぜ? 色々定石とかできてなかったんだよ
VS2005のエディタ上でスラッシュ(/)を3回連続で打ち込むと突然 /// <summary> /// /// </summary> に変換されるんですがこれなんですか?
XMLドキュメント
XMLの書式でしたか。 ちなみにスラッシュ2回じゃ何もおこらず、3回目で変換された理由は何でしょう?
2回で起こったらおちおちコメントも書いてられんわw
や、ヘルプで調べろよ
//の後ろにはコンパイルされないコメントが書けるとか書けないとか
298 :
デフォルトの名無しさん :2008/10/19(日) 20:18:38
ちょっと質問を。 構造体を返すメソッドを記述しているんだけどエラーが発生したときの処理に困ってる。 エラーを探知したら終了させるようにしたいんだけどコンパイルするときに 「構造体を返すメソッド書いてんだからエラーが発生したときもちゃんと構造体を返せ( ゚Д゚)ゴルァ!!」 って怒られちまった。 エラーが発生したときに返す構造体なんて全く想定していなかったわけだがこういうときって 何を返せばいいんだろうか? ちなみに return null; じゃコンパイルは通らなかった。
そもそもクラスでなく構造体を使う意味がわからんけど、 空の構造体でも返せばいいんじゃね?
>>298 >「構造体を返すメソッド書いてんだからエラーが発生したときもちゃんと構造体を返せ( ゚Д゚)ゴルァ!!」
そんなこと言うわけないと思うが。
こんなスレで質問するご身分なんだから、コンパイラ様のお言葉を勝手に意訳せずに
「ありのまま」書くべきなんじゃないのか?
値を返せないような場合は例外投げるしかないんじゃね? でTry...パターンを追加
302 :
デフォルトの名無しさん :2008/10/19(日) 20:29:40
>>299 複数個のデータを効率よく渡そうと思って構造体を使った。
クラス的な活用方法はしないから構造体で十分かなと。
> 空の構造体でも返せばいいんじゃね?
return new myStruct();
↑こういうこと?こんな方法使っていいのかな?
303 :
デフォルトの名無しさん :2008/10/19(日) 20:32:50
>>298 intを返すメソッドで何らかの例外的な場合には0や-1を返したりするだろ。
nullを返すか?
クラスじゃなくてあえて構造体を使うなら、初期状態の構造体を返すなり
構造体メンバにフラグやメッセージを含めてそれにわかるようなもんを入れて
返したりするのがいいんじゃね
ここはCスレかと
エラーが起きて値が返せないなら例外を投げればいいだけだと思うが。
>>302 同じ意味だけどreturn default(myStruct);の方が誤解を生まない
例外投げるかnullable使えよ
308 :
デフォルトの名無しさん :2008/10/19(日) 20:42:45
> 同じ意味だけどreturn default(myStruct);の方が誤解を生まない こんな方法があったとは・・・ C#って奥が深いな・・・
Nullableは意味のあるnullに使うものだと思うんだけど
そうでもない
311 :
デフォルトの名無しさん :2008/10/19(日) 21:20:21
戻り値が必須のメソッド内でも throw Exception() すれば戻り値設定しなくてもコンパイル通るの?
やってみればいいんじゃね?
>>311 愚問だよ。
例外を投げるって意味が分かってる?
>>311 当たり前の事だが、正常処理の戻り値は設定する必要はあるぞ。
で、例外というのは、その正常処理を続行出来なくなった時に、
処理を強制終了させる仕組みだから。
>>311 new がないからコンパイルは通らんね。
System.Exception Exception(){ return new System.Exception(); }
次は文末のセミコロンが無いから……
C#にてDWM(WindowsVistaのAeroグラス)をウィンドウに適用する方法についての 詳細な方法や情報はありませんか? ちょっと好奇心でやってみたらどうもうまく行かなくて突っかかっています
> 同じ意味だけどreturn default(myStruct);の方が誤解を生まない 残念だが同じ意味ではない。 return default(myStruct); の方がいいのは事実だが。
NPlotを使って散布図を描こうと考えています。 二次元配列で格納してあるデータをそれぞれX軸Y軸に対応させて linePlot.AbscissaData = test[j,0]; linePlot.OrdinateData = test[j,1]; のように設定しfor文でjを変えてデータをどんどんグラフに点を加えさせていきたいのですが上手くいきません。 どのように設定すればよいのか、ご存知の方ご指導お願いします
STLでよく使うイテレータってC#でも使う?
>>322 それforで回したら上書きされて最後のデータしか残らないやん
AbscissaDataとOrdinateDataにはコレクション入れるんでないの?
graphicsメンバに1ドットだけ描画するメソッドが見あたらないのですが、 1ドットだけ描画するにはどうすればいいのでしょうか? drawlineで 1,1,1,1 にしても何も表示されませんでした。
ドットなんて概念を排除してるからねー FillRectangleで代用かな
STLみたいな柔軟な使い方はない。 基本的には前方読み取りのみだから。
328 :
デフォルトの名無しさん :2008/10/20(月) 12:29:36
C#を始めたばかりなので上手く質問が出来るのか分からないのですが 今、平均点を求めるクラスを作り heikinten Asan = new heikinten(); でAさんの平均点を求めることが出来るようになりました これをAさん固定ではなく Bさん、Cさん、、、、Zさんなど いろいろな名前が記載されてるname.txtから人数を数えて その人数分だけそれぞれ平均点を求めたいと思っています 人数に応じて動的にheikintenクラスをオブジェクト化する方法は無い物でしょうか こんな方法もあるぞみたいなのがありましたら教えていただけないでしょうか よろしくお願いいたします
List<heikinten> heikinten[]
>>328 人数を数える方法はいいのかな?
人数がわかればその分だけList<heikinten>に突っ込めばいいんじゃないかな?
List<heikinten> people = new List<heikinten>();
for (int i = 0; i < 5; i++)
people.Add(new heikinten());
訂正: for分のi<5は人数を入れてね List<heikinten> people = new List<heikinten>(); for (int i = 0; i < 人数; i++) people.Add(new heikinten());
heikintenクラスに突っ込みたくてならないのだが StudentクラスにAverageメソッド用意するのが普通だろうと
>>329-
>>332 思った通りのことが出来ました
ありがとうございます
人数を数える方法は 改行コードをカウントして行けばいいかなと思っていますので
ファイル操作周りを勉強してやって行こうと思います
計算した値を返すメソッドを実装しています。 中には計算が無意味なケースもあり、そういうときはNullableの変数を返して 大元の呼び出しもとでの処理に役立てようと思っています( .hasValueフィールドで Nullableかどうか判別がつきます)。 そこで普通の変数と、Nullableの両方を返すメソッドを書くことにしました。 public Nullable<int> Method(int x) { ・・・(処理)・・・ if (計算が無意味なケース) { return Nullable<int> null; } return (計算結果); } ↑のように実装したところ、return Nullable<int> null; のところでエラーが出てしまいました。 そこでこの部分を、 Nullable<int> i = null; return i; としたところ問題なく通ったのですが、Nullableを返すためだけにわざわざNullable型の変数iを 宣言してやる必要はあるのでしょうか?なにか無駄なことをやっているような気がしてならないのですが。
return null; でいいんじゃないかな return Nullable<int> null;はたとえばintの3を返すときに return int 3; とかやるようなもんだべ
>>335 > return null;
> でいいんじゃないかな
( ゚д゚)!
うわぁ・・(;´・ω・)、それで通っちゃいましたorz・・・
お騒がせしてすいません(´・ω・`)
>>334 余計なお世話かもしれんが、int.TryParseとかDictionary<T>.TryGetValueみたいに
Public bool Method(int value, out int result){
{
・・・(処理)・・・
if (計算が無意味なケース)
{
return false;
}
result = (計算結果);
return true;
}
こうした方が良くないかね?
>>337 処理を明確化する意味でもNullableを使わずにbool値を使った方がいいでしょうか?
逆にNullableを活用すべき分野はどういったところでしょうか?
339 :
337 :2008/10/20(月) 16:18:23
>>338 俺は使ったことないから分からんけど、たとえばPoint構造体を使って座標計算をするときに、
普通にPoint p = new Point(); とやるとX=0,Y=0の構造体ができちゃうけど、それをそのまま座標計算に
使われると困ってしまうような設計のクラスライブラリとかで、Nullable<Point>とかを使うとか。
あくまで想像だが。
処理を分岐させたいだけだったらやっぱり
>>337 の方法にすべきだと思う。
out を使うのは負けだと思ってる・・・
>>338 よく使われる例だけど
データベースなどでは、通常の(有効な)値と null(無効な値)を取る型が使われる為、Nullable型があると便利。
まとめますと -データベースや行列のように大量のデータを一括して扱うときにNullable型を活用すると 処理に一貫性が出て楽 -一つ一つの処理を確実に行いたいときは戻り値にbool型で計算の可否を判定、計算結果の値は 参照型として渡す というのが定石ということですね?
参照型じゃなくて参照渡しな
すいません質問です。 publicなフィールドと両方publicな自動プロパティ、具体的に動作が異なるのはどんな時でしょうか?
数字を指定したスペースに表示させたいのですが、 Console.Write("{0,10}", num); 上記の例は数字numを10桁分のスペースに右詰めで表示させよ、という意味です。 この「10桁分」のところを変数にして、状況に応じて任意のスペースにさせたいのですが プログラムはどう書けばよろしいでしょうか? 任意のスペースを表す変数を n とします。 おそらく Console.Write("{0, n}", num); とするとエラーが生じてしまうと思います。 他に方法はあるでしょうか?
string fmt = "{0," + n.ToString() + "}"; Console.WriteLine(fmt, num);
348 :
デフォルトの名無しさん :2008/10/20(月) 18:09:22
C#で画像ビューア作りながら勉強しているのですが、Google Picasaみたいな 画像一覧部分でのスムーススクロールってどうやるのでしょうか? ListViewで画像一覧は出せたのですが、スムーススクロールもやってみたいのです。 画像に限らずスムーススクロールの仕組みを教えていただけるとありがたいです。
>>345 逆に言えばvirtualをつけなければ、同じなんですね。ありがとうございました。
プロパティかフィールドかっつう最も大きい違いがあるがな
プロパティは参照渡しできないし値型のときはコピーが発生する
後でフィールドを何の問題もなくプロパティに変更することはできないから,
とりあえず何も考えずプロパティにしとけ
>>320 >>302 の場合はまったく同じだよ
違いが出るのは対象がジェネリック型パラメータの場合のみ
private void Form1_FormClosing(object sender, EventArgs e) { //なぜか設定の保存が出来ない Settings.Default.SettingFont = textBox1.Font; } private void Form1_Load(object sender, EventArgs e) { //なぜか設定の読み込みができない textBox1.Font = Settings.Default.SettingFont; } SettingFontはSystem.Drawing.Font型です エラー警告メッセージ出ません 両辺を逆にしても駄目でした 複雑なコードにしたくありません 処理の早さ等は考慮しません よろしくおねがいします
>>353 Saveしてない、なんてオチではないだろうな
355 :
デフォルトの名無しさん :2008/10/20(月) 20:10:32
オレもまっ先に
>>354 と同じ発想がうかんだのだが
それはあまりにも…w と思い書けなかった
こっちのページですか?
下の二つのイベントハンドラを有効にして
いま下の怪しいところにSave();を足してみました
private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
// SettingChangingEvent イベントを処理するコードをここに追加してください。
}
private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
Save();
// SettingsSaving イベントを処理するコードをここに追加してください。
}
これでもエラーでませんでしたが
保存できていません、もしくは読み込まれていませんでした
>>353 のコードにも何か書くのですか?
>>355 勇気を持って全てをさらけ出してくれませんか?
わからないんです
Properties.Settings.Default.Save(); を書いてなけりゃSaveされんだろう?ってことだったんだけど。
>>358 private void Form1_FormClosing(object sender, EventArgs e)
{
//なぜか設定の保存が出来ない
//↑出来ました
Settings.Default.SettingFont = textBox1.Font;
//今、感動して涙が止まりません
Settings.Default.Save(); //Saveって本当に良いものですね
//ありがとうございました
}
ワロタ
>>321 レスありがとうございます。
DWMを利用するまでは自分でも何とか検索して出来たのですが、ボタン等のコントロール上の黒色が
透明化されてしまう、という問題があったので、それについて調べた所
ttp://piece.coron.jp/weblog/archives/2007/05/14/012953/ こちらのサイトで、UseCompatibleTextRenderingをtrueに変更してやる方法、というのがあったのですが
どうも使い方が分かりません、Program.csにてApplication.SetCompatibleTextRenderingDefault(true);に
してみたのですが、全く状況が変わりません
自分のレベルではまだこのようなことをするのは早いのでしょうか?
DWMは情報が少なすぎて困っています・・・
>>361 UseCompatibleTextRenderingはButtonやLabelとかの一部のコントロールにプロパティとして存在する。
DataGridViewのColumnsプロパティのようなものを自作するにはどういう方法が一般的なのでしょうか? やりたいことは、Columnsのようにプロパティ名[インデクサ]が実装したいのと Columns[i].Visible=false等で親クラスにプロパティ変更を知らせることです。 初めはColumnsクラスにイベントを作って親クラスに知らせる方法を考えたのですが、 その方法だと外からColumnsのイベント一覧が見えてしまいます。 そもそもそんなやり方は一般的ではないのでしょうか?宜しくお願いします。
普通にコレクション作ればいいじゃん > Columns[i].Visible=false等で親クラスにプロパティ変更を知らせることです。 このVisibleの変更はDataGridViewColumn.Visibleの変更であってColumnsとは関係ない まあ実際には大抵internalでDataGridView持ってたりするけどな
365 :
363 :2008/10/21(火) 12:34:44
ありがとうございます 早速試してみたのですが、internalを指定しても外部から見えてしまうのですが… [test1.cs] public class Data { internal Parent parent; } [test2.cs] Data test=new Data(); test.parent=null; ←通ってしまう internalって別ファイルからは参照できなくなると理解したつもりなのですが違うのでしょうか?
別アセンブリ。 exe/dll単位。
367 :
363 :2008/10/21(火) 12:44:57
ありがとうございます。 すると同アセンブリ内では隠しようがないんですね。フレンドもないようですし… となるとデータクラスのコンストラクタで親クラスを渡すしかなさそうに思えます。 ただ、データクラスのプロパティ変化時に親クラスのプライベートな処理を走らせることも難しそうですね^^; DataGridであればColumnクラスのWidth等変更時にグリッドの表示幅が更新されたりしていますが あれはどういったメカニズムなんでしょうか… さらに言えば、コレクションクラスにはデフォルトでRemoveAtが実装されているようですが、 これでは外部から削除できてしまいます。外部から要素数の変更はさせたくない場合、 コレクションクラスの実装は向かないのでしょうか… 混乱してきた・・・・長々とすみませんm(_ _)m
> ただ、データクラスのプロパティ変化時に親クラスのプライベートな処理を走らせることも難しそうですね^^; > DataGridであればColumnクラスのWidth等変更時にグリッドの表示幅が更新されたりしていますが > あれはどういったメカニズムなんでしょうか… 別にevent使ってもいい。 DataGridViewColumn.Widthなら多分DataGridViewのinternalなメソッド呼び出してる。 いやまあ再描画だけならInvalidate呼び出すだけだけどな。 > さらに言えば、コレクションクラスにはデフォルトでRemoveAtが実装されているようですが、 > これでは外部から削除できてしまいます。外部から要素数の変更はさせたくない場合、 > コレクションクラスの実装は向かないのでしょうか… やらせたくないなら例外投げればいいだけ。
なるほど、例外を投げるという手がありますね。参考になります。 イベントで実装もありかと思うのですが、何れにしろ同アセンブリ内なので 外部クラスからイベントの定義も出来てしまいますね。そこだけが問題です。 しかし実装自体は出来そうなので頑張ってみます。ありがとうございました!
0以上の整数しか使わないような変数に積極的にuintを使うのはいい方法でしょうか? それとも整数は特殊な事情がない限りintで統一するべきですか?
符号なし整数はCLS非準拠なので他の言語で使えないかもよ、と 実際VB7では扱い面倒だったしな private/internalならお好きに
2次元配列を作成し ARRAY[*,0]に得点を入れて ARRAY[*,0]の順番は変更しないで ARRAY[*,1]に順位を作成したいと思いるのですがいい方法が浮かばないで困っています 皆さん何かいい方法は無いものでしょうか
>>371 > 符号なし整数はCLS非準拠なので他の言語で使えないかもよ、と
おお、そういう落とし穴があったとは・・・
int型に統一させていただきますm(_ _)m
>>372 心底意味が分からん。
具体的に値入れて説明してくれ。
Console.Writeline("hoge"); で白文字以外にカラフルな文字を表示させることってできませんか? それが無理なら反転文字とか、アンダーライン文字とか、目立つ文字を表示できないでしょうか? 文書の一部分を強調表示したいんです。
>>374 分かりにくくて申し訳ないです
詳しく書くと
int[,] array = new int[8,2];
array[0,0]=100;
array[1,0]=10;
array[2,0]=80;
array[3,0]=20;
array[4,0]=90;
array[5,0]=40;
array[6,0]=60;
array[7,0]=30;
という得点が入ってるとして
得点によって順位を決めて隣の要素に入れて行きたいと思っています
array[0,1]には1
array[1,1]には8
array[2,1]には3
array[3,1]には7
array[4,1]には2
array[5,1]には5
array[6,1]には4
array[7,1]には6
といった感じに、、、、
まだ分かりにくいかもしれないのですが
何かいい方法無い物でしょうか
>>375 Console.ForegroundColor = ConsoleColor.Red; とかで切り替えればいいかも。
>>377 ありがとうございます、無事変えられました
>>376 static void setRank(int[,] array)
{
SortedList<int, int> sl = new SortedList<int, int>();
for(int i = 0; i < array.GetLength(0); i++)
{
sl.Add(array[i, 0], i);
}
int rank = 1;
foreach(var kvp in sl.Reverse())
{
array[kvp.Value, 1] = rank++;
}
}
こうかな、なんかもっとうまく書けそうで俺には書けなかった
>>379 こういうのって、「もっとエレガントにかけるかも」って思ってしまうよな…w
複数の計算結果を配列に格納する予定なんですが、あいにく得られる計算結果の順番と 配列の順番が逆だったりします。というわけで計算結果は配列の先頭からではなく最後尾から 先頭に向かって格納する必要があるわけですが、これを実現するには a) とにかくもうひとつ仮の配列(同サイズ)をつくり、何も考えずに先頭から計算結果を 詰め込む。全ての計算結果が出たところで本来の配列に後ろから値をコピーしていく。 b) 配列の要素数を表すstaticな変数を準備し、その変数を参考に配列に書き込む場所を特定する。 配列に書き込むたびにそのstaticな変数を -1 することで保存すべき配列の位置を特定することができる。 c) 配列をNullable型として宣言し、書き込む位置はnullが格納されている最後尾と決めれば 後ろからデータを格納することができる。 d) c)の亜種。配列を用意し、あり得ない数字(0とか-10000とか)で初期化する。 あり得ない数字の最後尾からデータを格納していけば後ろからデータを詰めていったことになる。 ざっと考えて上記のa)〜d)が思いついたんですがどの方法がいいでしょうか? あるいは他に方法がありますか?
初めから要素数が分かってるならbで十分だし(ていうか何故static?) そうでないならList<>に突っ込んでいって最後にReverseすればいいだろ
labelのTextが増えたとき、左に伸びていくようにするには どうすればいいでしょうか? 例えば、 label1.AutoSize=true; label1.TextAlign=TopRight; for(int i = 0; i < 10; i++) label1.Text += "あ"; では右に伸びていってしまいました。
>>382 > 初めから要素数が分かってるならbで十分だし(ていうか何故static?)
> そうでないならList<>に突っ込んでいって最後にReverseすればいいだろ
もしかしてReverseってList<>だけでなく普通の配列にも使えたりしません?
要素数は分かっているので何も考えず計算結果を配列に突っ込んだ後
最後にReverseかければa)〜d)のようなややこしいことをするまでも無い気が・・・
もしかしなくても、.NET 3.5では配列はおろかIEnumerable<T>ならReverseが使える。
>>382 > そうでないならList<>に突っ込んでいって最後にReverseすればいいだろ
List<>型に対してReverseはどう使えばいいでしょうか?
List<int> a;
に対して
Array.Reverse(a);
としたらエラーが返されてしまったのですが。
ちなみに一般的な配列なら問題ありませんでした。
a.Reverse();
メソッドに変数を渡して、そのメソッド内で変数を書き換えてかえしてもらうとき 値型なら問答無用でout/refを付ければいいとして、参照型の変数のときはどうすればいいでしょうか? 参照型なら別にout/refは付けなくてもメソッド先での変更はちゃんと反映されるかと思いますが・・・
どうしたいかによるとしか
例えば、参照型でもそれ自体を書き換えるなら必要。 void f(out object o) { o = new object(); }
newするかしないかで使い分ければいいということですね
使い分けというのは変だな どうしても必要な場合以外は基本的に参照渡しは使わない,でいいと思う
>>379-380 一次元配列ならこれだけなんだがなぁ
var array = new[] { 100, 10, 80, 20, 90, 40, 60, 30 };
var indices = Enumerable.Range(0, array.Length).ToArray();
Array.Sort(array, indices);
てか、誰か指摘してやれよ
>>376 の問題に多次元配列を使うこと自体が愚策だと
特別な事情があるか、どうせそのうち丸ごと捨ててやりなおすかと思ってさ
C++と違ってC#は構造体にもメソッドを定義できるようにされていると聞きますが、 わざわざクラスではなく構造体でメソッドを定義できるようにした意味は何でしょうか? メソッドを書くならクラスにするよう統一しても良かったと思いますが・・・
わざわざメソッドが定義できるのをクラスに限定するメリットがわからん
それ以前にC++でもstructにメンバ関数書けるんだが。
C++の場合はデフォルトのアクセス制限がpublicかprivateかの違いしかない。
他は全部classとstructは一緒。
>>396 はC#におけるクラスと構造体の違いを知りたいの?
C#では構造体とクラスはこれだけ近い存在にされてるのになぜあえて分けているのかが分からないんです。
話し聞いてないな。 C++においての違いはほぼ無い。 C#においての違いはそれよりある。
>>400 そもそも、C++の構造体にもメソッドが定義できるわけだが。
C++ は元々は C との互換性のために struct キーワード残しただけかと。 結局それが、慣例として使い分け方ができて、 C# では言語的にも値型と参照型で使い分けるように変化。
デフォルトのアクセス権がちがうだけだよね。あと、慣例ってのは重要なキーワードだな。
C++/CLIみたいにref classとvalue classにして 呼び方も参照クラスと値クラスにしたほうがわかりやすかったかもね
なんかC#の話じゃなさげなんだけど聞いてくれ。 デスクトップのアイコンにファイルをD&Dすると 開くアプリケーションとかあるでしょ?あれをやりたいんだけど C# D&DとかでググるとアイコンへのD&Dじゃなく 開いてるウインドウへのD&Dばかりがみつかるのさ。 だれか解説してるサイトか、これぞ、みたいな検索ワード 教えてくれないかなーっと。
static void Main(string[] args) { Console.WriteLine(args[0]); }
>>407 うわーい。ただの引数になるのか。
確認しますた。おばかでスマソ。
string[]型配列に処理した結果を参照で返すメソッドを作っています。 返す結果の有無を判別させるためにbool型をreturnします。 private bool Hoge(out string[] Str) { ・・・・(処理)・・・ return true/false; } この際、Strに返す結果が無いとき(つまりfalseをreturnするとき)、コンパイラに 「out宣言したStrを空のまま返すな( ゚Д゚)ゴルァ!!」としかられてしまうんですが こういうときはみなさんどうされますか? falseを返すときでも適当な文字を入れてお茶をごまかすべきでしょうか?
TryParseパターンではnull(default(string[])のほうがいいかも)を入れるのが普通みたい
>>410 Str = null(default(string[]);
としたうえで return false; すればよろしいんですね?
配列を返値にして要素数0の配列を返す 要素数0に意味があるなら仕方ないのでnull返す
TryParseパターンがfalseを返す時は「初期化されていない」って意味だから使えない値を返すべき str = default(string[]);だよ (str = null;と同じ意味) 値型かジェネリック型の場合は前者だけど参照型なら後者でいいと思う
みなさんどうもです。
まとめますと、
1.要素数を0の配列をつくりこれを返値にする : Str = new string[0]: return Str;
2.参照型だからnullを代入して返す : Str = null;
のどちらかということですね。
>>413 値型の場合は
default();
を採用すればいいと言うのは初耳でした。以前値型の変数にnullを代入して返そうとした
んですがコンパイラに蹴られてしまいました。代わりに default(「値型」); とすればいいとは
知りませんでした。結構有名な手法なんですか?
default(値型)はnew 値型()と同じなんだけど後者はなんか値に意味がありそうで嫌でしょ defaultは本来はジェネリックのために導入された機能で, default(T)は型パラメータTが参照型のときはnullを返し,Tが値型のときはnew T()を返す
なるほど、.Net2.0からの付加機能でしたか>ジェネリック
Control.BringToFront()が呼ばれたときに発生するイベントってないのかな?
WM_CHILDACTIVATE
>>418 Win32APIは出来るだけ使いたくないのでBringToFrontをオーバーライドすることにした。
や、WndProcのオーバーライド(またはNativeWindowでのメッセージフック) だから純粋なマネージドコードだが。
"abc123" -> ok "abc:12" -> ng みたいにファイル名が有効か判断するメソッドってある? なければ例外で処理すればいいんだけど
Path.GetInvalidFileNameChars とかあるけどドライブ指定できない時点で厳密ではないな やはり基本は実際に作ること :だってNTFS的にはパスとして有りなんだぜ .NETからは使えないけど
423 :
デフォルトの名無しさん :2008/10/22(水) 19:40:00
C#でできたソフトってどんなのがあるのでしょうか? また、普通ソフトってどの言語で作られているものなのでしょうか? (ここでいうソフトってのは、市販のソフトだったり、フリーソフトだったり。)
>>423 マジレスすると実行ファイル開いて
はじめの一行(#!〜)に
perlってあればperl
shってあればシェルスクリプト
ruby(ry
Delphiで作ると Delphi臭がするのはなぜだろうw
同じクラス内に最後と引数の個数以外が全く同じメソッド1,2があるとします。 void Method1(int i) { ・・・・・(うり二つ)・・・・・ ・・・(ココだけ違う)・・・・ } void Method2(int i, intj) { ・・・・・(うり二つ)・・・・・ ・・・(ココだけ違う)・・・・ } 最後の (ココだけ違う) と、引数の個数の違いだけですが律儀に2つのメソッドを記述する必要があるでしょうか?
private void うり二つ(int i) { うり二つ… } void Method1(int i){ うり二つ(i); ここだけ違う } void Method2(int i, int j){ うり二つ(i); ・・・(ココだけ違う)・・・・ }
コンストラクタでよくあるパターンだよなw
> 値型の default(T), new T()
Point構造体とかだと明示的にEmpty返すことはあるな
>>421-422 確か、Path.GetFullPathかFileInfo使えという結論だったはず
パスの有効性をチェックする非公開メソッド(確かinternal)があって、
結局はそれが呼ばれるので、最も副作用が無いもの使うのが良いという話
>>423 > C#でできたソフト
VS, SSMS, etc.
SSMS(2005)はよく落ちる(.NET標準のエラーハンドラが出る)からすぐ分かるよ
参照型はnewしないと使えないって教えられたんですが string型は参照型なのにnewしなくても使えるのはなんでですか?
C#とCLRに組み込まれてるから 簡単に言うと,特別だから
なるほど ありがトン
そんなすっとこどっこいな回答で納得しちゃダメw 実際にはnew(インスタンスの生成)しなくても使えているわけではなく、 インスタンスの生成がラップされている、つまり間接的に生成してるだけ。 つまり、別に文字列以外のクラスでも同じように見かけ上newを隠蔽することはできる。
( ・∀・)つ〃∩ ヘェーヘェー
>>433 ちげーよ。文字列ってのはCIL上はプリミティブ型で、
それを巧妙にクラスに見せかけてあるだけ。
>>435 わけのわからん混同しすぎ。
System.Stringが様々な場面で特別扱いされるという事実と
>>430 の話は直接関係がない。
string str = "Hello World";がなんでnewしなくていいのかという話なら 暗黙にnewされてるからというのは間違いで「特別扱いだから」としか答えようがない
String str = new String("Hello World");で統一すれば惑わされずにすむ
javaと違ってC#ではできないよそれ
new は実行時にヒープにオブジェクトを作ってそれへの参照を返す。 文字列リテラルの場合はコンパイルの段階でメタデータに格納しておき、 実行時にはその文字列への参照を返す。 こういった仕組みの相違が文法にも反映されている。 たぶん。
String str = new String("Hello World".ToCharArray()); うはは、無駄無駄無駄!
>>440 違う
stringはCLIの組み込み型
string定数を読み込むIL命令があるの
変数sに代入したアルファベットをtextboxに出力するのってどうすればいいんですか?
>>443 > string定数を読み込むIL命令があるの
ldstr だよね。通常の参照型は newobj 。
別に
>>440 で間違ってないと思うけど、どこか勘違いしているなら指摘お願い。
447 :
443 :2008/10/23(木) 00:30:31
ああすまんミスリード コンパイラの話してるのかと思った
textbox.Text = s;
むしろ全部暗黙newすべき
せんでよか
ldstrでインターンプールから読むだけ。 stringインスタンスは、インターンプールにまだなければ、 JIT時に実体が作成されインターンプールに保存される。 んじゃないかな?
正規表現で文字列を表現しようとしているんですが、
@"(文字列)"
↑の(文字列)の部分に " マークが入っている場合はどう対処したらいいでしょうか?
エスケープシーケンス\をしても認識してくれません。
たとえば↓のような例の場合です。
string str = @"<a href="
http://www.google.com " target="_blank">";
@使うな
失礼しました。 @は使わない方向で頑張りますorz・・・
>>457 正規表現を使いたいなら@は使うな、ということですよね?
_, ._ (;゚ Д゚)
吹いた
private void系を並び替える機能ありますか?
グラフ(散布図)を作りたいのですが、よくわかりません。 書店に置いてある本は、線や円の描き方は載っているものの、グラフ作成の方法までは載っていないのがほとんどでした。 NPlotも試してみましたが、NPlotの使い方が分からず挫折しました。 グラフの描き方について詳しく書かれている本があれば、教えて欲しいです
>>463 座標系とプロットしたい値、それを描画方法する方法が全てじゃない?
全て知ってると思うけど
465 :
デフォルトの名無しさん :2008/10/23(木) 19:18:46
コピペ君って馬鹿だな、まで読んだ。
コピペ君って馬鹿だな、まで読んだ。
書店の本でおすすめを教えてください 分厚いのではなく萌えるC#的なのでお願いつかまつります!
薄手のエロ本片手にリッチャーのC#本でも読んどけ
そいやHead First C#が出たみたいだな いつものように分厚いだろうし萌えもしないだろうけどな
472 :
デフォルトの名無しさん :2008/10/23(木) 21:34:34
: error LNK2019: 未解決の外部シンボル _prntf が関数 _main で参照されました。 : fatal error LNK1120: 外部参照 1 が未解決です。 VS2008でC言語のプログラムを作ったのですが、コンパイルしようとしたら↑のような エラーが出てきてしまいました。どうすればよいのでしょうか?
C#とCは違う言語だ。
>>472 それはprintf()のつづり間違いだろ。
475 :
デフォルトの名無しさん :2008/10/23(木) 21:38:44
476 :
デフォルトの名無しさん :2008/10/23(木) 23:05:27
C#2005ExpressEditionでアプリケーションを実行するとDataGridViewに 自動的にデータが読み込まれるんですが、これの接続はすぐ切れるんですか?
今の子供たちの切れやすさと同じです
C#2008Expressでネイティブコードを出すにはどうしたらいいですか?
ビルドプロセスを弄ってC++のコードをコンパイルできるようにする
>>478 無い。
むしろ.NETをネイティブだと思うんだ。
CodeDOMやReflectionを使えば
C#コードをManaged C++コードに直すことは出来そうなんだがな
Managed C++にしたところで、Console::Writeがprintfになるわけでもないけどね
>>478 ngenじゃだめ?
ネイティブコンパイルの話は定期的に出るね。 GC、型システム、BCL(基本クラスライブラリ)をそのままにしてネイティブコンパイルしても、 ほとんど効果がないばかりかマイナスになる可能性が高い。 GC、型システム、BCLを別のものに置き換えればそれはもうC#ではない。 前者のアプローチはjavaにたいしてgcjがやってみたのだがさっぱりなのはご存知の通り。
ngen.exeをRunに登録させればいいの?
ngen.exe したからといって C/C++ で作ったような exe が出来上がるわけじゃないぞ 依然として実行には .NET Framework が必要
フォルダにテキストファイルがあるときに自動的に起動したいと思います。 string[] files = Directory.GetFiles("my documents", "*.txt", SearchOption.AllDirectories); foreach(string file in files) { if ( File.Exists(file) ) { //fileがあるときだけと書いたつもり。 Process.Start("Notepad", file); //メモ帳を起動する。 }} で、コンパイルは正常に通るのですが、ifのところでファイルがないという例外が出ています。 全体をtry〜catchで包むと、ファイルがないエラーは発生しませんが、今度は、ファイルがある場合2回起動します。 なんでこんなふうになっちゃうのでしょう?
なんて例外が出たのか try-catchでどう囲んだのか
言葉が足りなかったか ソースとメッセージをそのまま貼ってね
>>478 何のために?
つか、実行時はネイティブに変換されるんだが、それじゃダメなのか?
490 :
476 :2008/10/24(金) 04:01:56
>>477 ありがとうございます。すぐ切れてしまうのですね。
あれから、プログラムを組んでまた疑問点にぶち当たりました。。お助けを・・
DataSetとDataGridをツールボックスから貼り付けてDataSetで指定したデータベースを
データグリッドのデータソースとして登録しました。Formがロードされると
一覧が表示されるのですが、フォームに貼り付けたDataSetオブジェクトにその後アクセスすることは
不可能なんでしょうか?
やりたいことは、フォームが表示される→ボタンを押すともう一度そのデータを参照・更新したいのですが
フォームがロードされたときのDataSetオブジェクトにアクセスできれば良いと思うんですが無理ですか?
やりたいことを果たすためには、ButtonのOnClickメソッドの中でDataSetオブジェクトを作成して
もう一度データベースからデータを取得する必要があるのでしょうか?
このフォームに貼り付けたDataSetオブジェクトも色々なソースファイルを眺めてもどこにもでてきませんので
利用する事は不可能なんでしょうか?
意味がわかりにくい文章ですみません。もし分かる人がいたらおしえてください。
491 :
476 :2008/10/24(金) 04:08:49
事故解決しました。。FormLoadに書いてあった。。 すみませんでした。
492 :
476 :2008/10/24(金) 04:24:50
すいません。。やっぱりわかりません。 FormLoad時以降もフォームに貼ったDataSetオブジェクトにはデータがいっぱいつまっているのですか? もし、FormLoad以降もデータが蓄積された状態ならば、私は他のフォームからそのデータセットを使いたいんですが、 private宣言されています。publicにかえちゃっていいですか? すみませんがよろしくお願いします。もう寝ますので明朝みます。
教えてください。
C# uniq
で、
http://d.hatena.ne.jp/siokoshou/20050408 のソースが見つかったんだが、これでテキストをuniqするには、
string text = File.ReadAllText("test.txt",Encoding.Default);
text = Siokoshou.ArrayListWithUnique.Unique(text);
File.AppendAllText("test2.txt" , text, Encoding.Default);
じゃだめなん?
コンパイルすると、
エラー 1 引数を '1' 個指定できる、メソッド 'Unique' のオーバーロードはありません。
といわれる。たしかに、Uniqueには引数の指定がないが…。
イエスノーキャンセルダイアログで if (MessageBox.show(なんとか) == DialogResalt.Yes) { はいが押されたときの処理 { else if ==DialogResalt.No //ここどういうふうに書くの? { いいえが押されたときの処理 } else { キャンセルの処理 }
DialogResult result = MessageBox.show(); if(result==DialogResult.Yes) else if(result==DialogResult.No) じゃダメ?
一時変数に突っ込みたくないならそこ if じゃなくて switch にするって手もあるけどやめとけ
>>496-497 ではDialogResultの処理はifで統一しときます
ありがとうございました
IntPtrって何の略? Int32やInt64と同じように,ポインタサイズの整数型ってこと?
>>499 まんまInteger Pointerの略で良いと思う。
システムによってポインタのサイズとint型のサイズは必ずしも同じではないから、区別されてる。
起動しているプロセスを、読み込んでいるファイル名込みで取得するにはどうしたらよいですか? たとえば、Notepadで、orange.txtというファイルを読み込んでいる場合、 if(Process.GetProcessesByName("Notepad.exe").Length == 0) で、Notepadが起動していることはわかります。 同時にorange.txtと、banana.txtというファイルを読み込んでいる場合に、 区別して扱いたいです。
notepadならMainWindowTitleで分かるんじゃない?
スマートな方法はないわな
>>492 別に良いんじゃないの?
デザイナーで貼り付けたDataSetなら、直接ソースを書き換えるより
デザイナーでDataSetのオプションのModifiersをPublicにする方が良いんじゃね?
using System; namespace TestApplication { class Test { private string message; public Test(string message) { this.message = message; } public void Say() { Console.WriteLine(message); } } } 上記のコードをCSharpCodeProviderでコンパイルしてインスタンスを作成し、Sayメソッドを呼び出すことはできますでしょうか。 ネット上ではstaticなメソッドの呼び出しとかはよく見るのですが、このケースについては見つけられませんでした。
Activator.CreateInstance
>>505 出来るはず。インスタンスの作成はActivator.CreateInstanceで出来る.
using System.Reflection;
Assembly asm = hogehoge.CompiledAssembly
Type classType = asm.GetType("myNamespace.MyClass");
Object = Activator.CreateInstance(classType);
>>493 uniqになってないしw
ついでに、Enumerable.Distinctがある今ではそいつは不要だな
>>502 ばっちりでした。
ありがとうございます。
510 :
デフォルトの名無しさん :2008/10/24(金) 16:24:19
質問です。 Microsoft Visual C# 2005 Express Edition で開発しているのですが、変数やメソッドを使用している 箇所で右クリックして、「定義へ移動」や「すべての参照の検索」を選んだとき、同一ソリューションの 他のプロジェクトにあるクラスは検索の対象にならないようです。 ソリューション単位でビルドしているのにこれは変だと思い、いろいろ設定を探したのですが、 見つかりませんでした。 どのようにすれば、他プロジェクトを検索してくれるようになるのでしょうか? よろしくお願いします。
>>508 Enumerable.Distinctですか。
public static IEnumerable<TSource> Distinct<TSource>(
this IEnumerable<TSource> source,
IEqualityComparer<TSource> comparer
)
というのですが、例示するとどうなりますでしょう?
512 :
492 :2008/10/24(金) 19:54:54
>>504 デザイナーで切り替えができるんですね。初めて知りました。というよりC#が初めてだ揉んで・・
Javaの場合はデータをカプセル化して、メソッドでデータをset/getしてまして、
DataSetをカプセル化してメソッドでDataSetをset/getするのもスマートなやり方じゃないなあ、
でもソースコードでpublicにするのもちょっと違和感がありまして、一番オーソドックスな方法を知りたかったのです。
デザイナの方で色んなformから参照できるようにすることができるなら、それが一番しっくりきますね。
一番いい方法を教えていただき、感謝しています。本当に知りたかったのでうれしいです。
どうもありがとうございました。
513 :
デフォルトの名無しさん :2008/10/24(金) 20:29:38
>>504 フォームのコントロールのmodifierがデザイナから変えられるって俺も
初めて知った。
つーか、492と同じくコントロールをpublicで外部に公開するのは作法として
よろしくないもんだと思って一所懸命コントロール操作用のメソッドを書いてた
public void IncrementProgressbar(int i)とか…
作法云々じゃなくて普通のプログラミングセンスしてれば そんなことをしたいとは思わないはずだと思う。 逆に言えば、そんなことをしたいと思うのは99.99%どこか設計がオカシイんだよ。
IncrementProgressbar こんなもんコントロールをpublicにするのと変わらん フォームの「役割」を考えるんだ
516 :
デフォルトの名無しさん :2008/10/24(金) 21:00:52
do〜while文でループ処理をしています。 ループ処理を実行し始めてから次のループ処理を実行するまで最低でもxxx分はあけておきたい という場合にはどうプログラムを組んだらいいでしょうか? ループ処理が終わった時点でxxx分経っていなければ、どこかでxxx分になるまで待つ 必要があります。反面一つのループ処理にxxx分以上かかった場合は待つことなく 即次のループ作業に入らせたいです。
>>517 ループの先頭で、clock()とかで時刻をとって、ループの最後で一定時間たってるか確認して、
足りなかったらsleep()系の関数で止まる。
ゲームならスレッド止めないでApplication.Idleイベント使った方がいいよ
>>518 >>519 どうもです。
sleep()
Apliclation.Ide
どちらがいいですか?
>>520 そもそも何故そんなことをしたいのか、という重大な疑問を棚に上げたままで
まともな回答なんて期待するだけ野暮だと思うぞ。
>>506 ,507
出来ました。
これ使えればなかなか面白いことが出来そうです。
foreach(int a in GetIntegerList()) { yield return a; } これをもっとシンプルに書けない?
それだけならreturn GetIntegerList();でいいだろ 前後にもyieldがあるなら,前後のyieldをそれぞれ別のメソッドに分けてEnumerable.Concat
string[]をstringにするときってどうやるの?
String.Concat
今から本格的にC#を勉強する! おまいらよろしく。
質問していいのは一通り勉強してからだよ
どうして?
ガイドラインって通読しておくもの?
馬鹿にされたくなければ「クラスライブラリの開発者向けガイドライン」くらいは読んどいた方がいいんじゃね
>>530 入門者は変にいろいろ考えるよりも勉強した方が早い
でもわからない事はきいたほうがはやいじゃん?
textBoxで、下地の背景を表示したいと思います。 textBoxを半透明にするにはどうしたらよいですか? 普通に配置して、プロパティで選択すると、 できないといわれます。 代わりに、textBoxの上にpictureBoxを配置したら、 透明にはできましたが、textBoxは下になって隠れてしまって、 文字入力できません。
初心者のみなさん
こまったちゃんが
>>529 みたいなこと言ってるけれど
好きな時にすきなだけ質問していいんだよ
>>538 なんだか意識が小学生だね君ってw
行動の基準が「先生に怒られるかどうか」って感じ。
良いか悪いか(先生に怒られるかどうか)じゃなくて、
そうしないとお前が損するんだぜって話だと思うんだが。
>>527 ありがとう。String.Concatでできました。
>>540 WPFしてみます。
がっ。デザイナが開かず、
「TrueTypeフォントのみがサポートされています。
これはTrueTypeフォントではありません」
って、これってどれよ?
再起動してみる VSのフォント関連の設定をリセットしてみる SP1入れてないなら入れてみる VS再インストール
大量のテキストデータから指定した複数の単語を含む文章を検索するプログラムを 作ろうと思っています。各社のニュース系のサイトから記事を自動的に収集してくる プログラムを作り、記事を保存します。社によっても違いますが、だいたいニュース系の サイトは半年以内にリンク切れしてしまうので、そうなるまえに記事を自動的に収集して おき、必要に応じて検索して過去の記事を探してくるプログラムを作りたいわけです。 そこで大量のテキストファイルから合致する記事を探し出してくるプログラムを作る必要 があるわけですが、C#でそういった検索プログラムを作る上で参考となる手法はあるで しょうか?とくに無ければ検索ワードを入れると過去記事を一から順番に巡回して探し だす、何の変哲もないプログラムにしようかと思っています。
めんどくさいからナマズに探させればいいじゃん
すごい基本的なことなんですが本で勉強していて 「変数をカプセル化するためにプロパティを使う。 変数をprivateにし、プロパティをpublicにする」 ってなってました。 結局publicでアクセスできるんだから カプセル化されてないような気が? どういうことなんですか?
プロパティにしておけば、値が設定される時にその値を検査する仕組みを入れたり、 変数の実体を無くして動的に計算して値を返すなんてことも出来るし。 変数のままpublicだったらそんなこと出来ないだろ?
それはそうだと思うんですが カプセル化するためっていうことを考えると プロパティもprivateにするべきじゃないかと思いました
じゃあ、クラスの他のメソッドを通じて変数に値を設定することも、 値を読み出すことも出来ちゃだめってことにならない?
>>547 webブラウザを通して検索させるということですか?
>>552 インターフェースはCCGIに限らないよ
カプセル化をちょっと誤解してました。 すいません。 ところで クラス内のフィールドにアクセスする時も 全部プロパティ経由の方がいいんですか?
本当に誤解が解けたのが疑問だが 全部プロパティ経由でおk
List<string>とかはフィールドのまま使うしかないですよね?
意味不明です
コレクションもプロパティにしていい ただしList<string>型のパブリックプロパティはガイドライン違反だからIList<string>として返すとか
初めて聞いた そのガイドラインどこにある?
どうもどうも
>>555 なんか端折った話?
publicな変数をインターフェースを変えることなくプロパティに出来るのが
C#のプロパティのメリットじゃないのか?
それは間違い publicフィールドをプロパティに変えたら使用側がエラーになる場合は多い 面倒なら自動プロパティでいいから全部プロパティにするべき
>>544 SP1にバージョンアップし(3時間もかかった…)、
WPFを使ったら、テキストボックスの背景に、
画像を表示できました!
アドバイス多謝。
C#ってSTLのvectorに相当するコレクションある?
List<T>
WPFって実用段階に入ってるんだっけ?
とっくの昔に.NET3.0と一緒にリリースされて .NET3.5にバージョンアップしてVS2008で正式サポートされてる
いやそれは知ってるけど数年前の普及価格帯のノートPCとかでも 普通にストレスなく動くのかと。
余裕
WPFの質問です。 textBoxでボックスの幅で折り返しして、 複数行を表示するにはどうしたらいいですか? 普通のFormの場合には、 textBoxの右上に小さい矢印が出て、 そこをクリックすると、multilineを選択できました。 ひょっとしてtextBoxでなくて、 textBlockを使うのかなと思ったのですが、 こちらでは文字入力できず。
>>571 MaxLineが1じゃなけりゃ普通に複数行じゃない?
リターンキーで改行したいなら、AcceptsReturnにチェック
>>571 少しは自分で調べたの?
プロパティ見たらTextWrappingとかAcceptsReturnとかすぐに見つかったんだが
みなさんありがとう。 調べてMaxLinesの値を10000とかにはしてみたのですが、 なぜか失敗してました。 TextWrappingは見逃してました。 textBlockのほうを見て混乱してたかも。 WPFは初めてなので、ちょっと勝手が違ってとまどってます。 msdn見てたら、むちゃくちゃ強力ですね。
WPFは柔軟な代わりに結構複雑で難解だよな
慣れの問題だよ
WPFは色々いじってみたいけど、認知度がやたらと低いのが難点。 表とかアニメーションとか簡単に表示させられるし、とても魅力的ではあるんだけどね。
そもそも公開しなくて済むならそれにこしたことはない ほんとに公開する必要あるの?
>>563 マジっすか・・・
参考までにどういうケースでおかしくなるか2、3教えてくれん?
Reflection絡みぐらいしか思いつかん。
自動プロパティ使えるといいんだけど、うちぁVS2005だからなぁ・・・
違いなら ・ref, out の動作 Int32.TryParse("...", ref inst.Field); ・フィールドのフィールド inst.Field.Field = value; ・データバインディング全般(リフレクションベースなので) ctrl.DataSource = values; 個人的にはパブリックフィールド使いたいのなんて値を表すような クラスが大半だろ?ってことはバインディングに使われやすいわけ だろ?なんで初めからプロパティにしない?と思う。
> publicな変数をインターフェースを変えることなくプロパティに出来るのが > C#のプロパティのメリットじゃないのか? privateなフィールド+アクセサだとobj.GetFoo()やらobjSetBar(123)とか書くの面倒だから っていうのが第一にあると思うぞ
javaだとそういう見にくいコードになるね
フィールド直接見せるのはダメだろJK ↓ でもOOPとしてオブジェクトは操作と属性を持つってなってんのに属性を見せないって変じゃね? の解としてプロパティ
>>582 そうだけどコンポーネントモデルにおけるいわゆる「プロパティ」が
メタデータレベルで一級の扱いを受けるようになったことのほうが
大きい。
一級扱いだから「プロパティ」そのものにアトリビュートが付けられる
ようになったしアクセスするオブジェクトのモデル(リフレクション)も
整理された。
わかりにくいなら例えば Browsable アトリビュートは「どれ」に付け
るべきかって話を考えてみるといい。セッタかゲッタ、クラスだと
意味的に変だろ?なら型のメンバとしてサポートしなきゃと。
・・・という話があるわけなのだが C# に詳しくない人が単なるシンタ
クッスシュガーだとプロパティを判断して迷宮に迷い込むと
586 :
デフォルトの名無しさん :2008/10/25(土) 19:11:36
>>581 サンクス。
ref、outに使えないのは知らなんだ。
滅多に使わないからなぁ。>ref、out
フィールドのフィールドは良く分からなかった。
そういうコードが出てきた時に気にしてみるよ。
>個人的には
個人的な話をすると、バインドするつもりが無かったデータのクラスを
後から何かにバインドすることが殆ど無いので。
>>581 のフィールドのフィールドの例は,前の方のFieldが値型の場合
プロパティに変えたらコンパイルエラーになる
一番やっちゃいそうな例だね
たぶんどっかでやってる
588 :
デフォルトの名無しさん :2008/10/25(土) 23:19:48
プログラムを始めて苦節3年・・・ やっと自分のソフトを開発した。 英単語記憶&テスト付き高機能単語帳だ。しかし、Vectorにうpろうとおもったら なんか6000語登録してあるとかいうソフトがたくさんある・・ 著作権もあるだろうし、単語登録なんてできねえ。こりゃ、ダウンロード0だな・・
>>588 ネットの英和辞書からデータをダウソして、そのソフト用のデータを作成するツールを作って一緒に配布するんだ。
そりゃ、ダウンロード0だな
>>588 「テスト付き」ここがどういう仕組みか次第だな
出来がいいならデータの拡張だけで人気でるかもね
Settingファイルが実行ファイルと同じフォルダに出来ない MicrosoftとかAppleとかRealのデータフォルダ入ってるとこに自分の名前入っててクソワロタ
594 :
588 :2008/10/26(日) 01:50:59
>>589 そんなことできるのかい?できるなら、是非やりたいなあ。単語データがたくさんあれば
だいぶ目鼻がつくよ。
>>591 テスト機能は、おいらが英語のTOEIC受けるときにこういう機能があればいいというのは
全部実装したから、それは目玉だよ。われながら。。かなりインターフェイスとかも
自信があるんだ。
>>590 今のままだと0だとおもうよ。。実際。
>>592 今のところ0だよ。
すれ違いなので、この辺にしときます。みんなありがとう。
program.csから開始するのがデフォなの? 次どこに飛ばされるの?
ファイルパスからファイル名だけを得る奥義を私だけにコッソリ伝授してください
>>596 質問する前に検索しろ。
「C# ファイル名 取得」でググればすぐ出てくるだろ。
というか検索しなくてもだいたい想像つくだろw
ファイルパス - ディレクトリパス = ファイル名までは考えたんですけど、 ここでグーグル先生に頼ったら負けかなと思っている
2chに頼る方が負けだろ
2chにも頼るなよ負け犬
俺はいつ同じ書き込みをしたんだ
じゃあどうすれば勝てるって言うんですか!!
調べる気がないならfor文使えばいい
今、問題のファイルパスはローカル変数sに入ってます この文字列がファイルパスだということをプログラム上まだ知らせていません 自動的にファイルパスだと理解してくれてるんですか?
System.IO.Pathが怪しい
神はどうしても私を天才プログラマーにしたいようです 自己解決しました
いや、つまんないから
608 :
546 :2008/10/26(日) 11:10:33
以前このスレでデータベースについて質問した者です。 もぐらを使えばいいとのことでしたが、できればデータベースとウェブデータ収集プログラムは 一心同体のものにしたいと思っています。データベースと収集プログラムを別々で起動する 方式にしては使い勝手が悪いので・・・ つきましては、「収集プログラム」の中にデータベースにインデックスを作製して格納する機能を、 「閲覧プログラム」にはデータベースに作製されたインデックスをもとに素早く検索してくる機能を 実装したいのですが、これを実現するにはデータベースを一からプログラムする必要があるでしょうか?
Namazuがどういうことをしているのか調べたのか?
>>609 ナマズはCGIとして動く別アプリかと・・・
使いたいデータベース名(SQL Server, MySQL, PostreSQL, ...etc)と、"全文検索"でググレ
>>608 収集プログラムを起動したら、そのプログラムからデータベースを起動すればいいだけ。
一般的なデータベースは、バックグラウンドで自動起動するけどね。
マウスホイールのイベントを this.MouseWheel += new MouseEventHandler(XXXXXX) と実装していたんですが、マウス(というかドライバ)を交換すると このイベントが来なくなりました。 ドライバによって違うものなんでしょうか
615 :
614 :2008/10/26(日) 17:49:49
すいません。日本語おかしいですがおねがいします。
ホイール自体は使えてるの?
使えています。ただIEなどをスクロールしても微妙に動きが違います。
たまにキーボードの矢印キーを送るようなマウスはある
WM_MOUSEWHEELに直結したイベントだから.NETがどうのというレベルじゃないね
ユーティリティが機能追加のためにいろいろやってるケースだな
621 :
614 :2008/10/26(日) 18:57:24
皆様どうもありがとうございます。 なんかどうにもなりそうにないのでドライバ戻します。 業務での要求じゃなくてよかった…
コントロールパネルとかで設定できるなんてことはない?
WebBrowserクラスを使ってタブブラウザを作りたいんですが、WebBrowserで開いたページのリンクを開くと、IEが起動してしまいます。 どうすれば新しいタブで開くように出来るんでしょうか?
624 :
614 :2008/10/26(日) 19:39:30
>>622 コンパネ→マウスからホイールでスクロールする行数は
設定できています。
614ではXXXXXX関数の中で、スクロールする量を設定して
スクロールさせているのですが、このXXXXXXが呼ばれません。
が、スクロール自体はするんです。それは多分コンパネで
設定した量が反映されているのだと思います。
なので、このイベント使わない方法でスクロールさせている
のかなあと。
626 :
デフォルトの名無しさん :2008/10/26(日) 19:53:53
>>612 > 使いたいデータベース名(SQL Server, MySQL, PostreSQL, ...etc)と、"全文検索"でググレ
やはりデータを格納するときか、データを取り出すときにこれらのデータベースアプリを
別途立ち上げる必要がありますか・・・
628 :
623 :2008/10/26(日) 20:23:05
返信ありがとうございます。
ド素人のため、出来ればレジストリを使わない
>>626 の方法を使いたいと思います。
axWebBrowserを使うのは初めてなので、また困ったら質問に来ます。
SQLiteだったら、アプリに直接組み込める。
>>629 VS2005でプログラムを組んでいるんですが、そこでも直接組み込むことはできるんでしょうか?
つSystem.Data.SQLite
>>631 > つSystem.Data.SQLite
なんと、VS2005にデフォで用意されていた機能でしたか(´・ω・`)
おやそうじゃないよw ググってみ
今ならSQL Server Compact Editionという手もあるな
mdbファイルでもいいんじゃね?
現在C#.net(2005)にてWindowsForm内のコントロールを ArrayList()に格納した後に、その要素の中の一番目に フォーカスを最終的に当てたいと考えているのですが うまく行きません。どうすれば良いでしょうか? ※for each 文を使用してコントロール要素にフルアクセスし た場合は出来ます。 //エラー 1 'aryAll' は '変数' ですが、'メソッド' のよう に使用されています。 ArrayList aryAll = new ArrayList(); foreach (Control c in this.Controls) { aryAll.Add(c); } aryAll(0).focus();
aryAll[0].Focus()じゃないの ArrayListは推奨しないけど
>>637 サンクス!!W
VB.NETとコードの文法がごっちゃになってましたW
textBox1上のIBeam?(マウスじゃなくて書くときに出る縦棒)の位置を一番初めに飛ばすにはどうしたらいいですか?
textBox.Select(0,0)じゃなかったか
641 :
639 :2008/10/27(月) 06:28:24
642 :
デフォルトの名無しさん :2008/10/27(月) 07:46:03
ひとつ教えてくだしゃんせ。 public void method1(){ string s = 定義; } とすれば、 private void method2(){ if s != 定義 } と呼べると思ったのだけど、sは現在のコンテキスト内に存在しないというエラーになります。 メソッド2からメソッド1で指定したstringを参照するには、どうしたらいい?
すみません質問です Buttonコントロールをオーナードローで画像表示したいのですが Buttonコントロールが押し込まれている状態であるかを取得する方法が分かりません ご教授願えませんでしょうか
class Hoge{ string s = null; public void method1(){ s = 定義; } private void method2(){ if s != 定義 } こうすりゃいいんじゃね
>>643 sをクラスのメンバ変数にする。
private string s;
public void method1(){
this.s = 定義;
}
private void method2(){
if this.s != 定義
}
647 :
646 :2008/10/27(月) 10:11:05
や、かぶった。
>>644 無かったっけと思ったら見当たらないねー
とりあえずBM_GETSTATEを使えば取れるだろうけど
>>645 、646
thanks!
これをクラスのメンバ変数というんだ。
メンバ変数とは、クラス直下で指定する変数のことなのね。
ふむふむ。VisualC#ではフィールドというと。
それに対して、メソッド内部で指定するのはローカル変数。
ひとつもふたつも勉強になった気分。
回答ありがとうございます BM_GETSTATE(f2)で取得してみましたが、ボタンを押しこんだ状態では BST_PUSHED(4)ではなくBST_FOCUS(8)が帰ってきてしまい取得できません 12あたりが返ってくるかと思ったのですが、呼び方がおかしいのでしょうか…
横入りスマソ 極端な話クラス内フィールドなんて無くても構わなくない? メソッドの引数で値のやりとりを完結させることってじゅうぶん可能だろ。 フィールドの怖いところはメソッドの預かり知らないところで値が書き換えられる 可能性があるという点だ。一昔前のC言語のグローバル変数の怖さといったら 伝わるかな?俺にはフィールドというのは、そのグローバル変数に匹敵する 怖さを持ち得ていると思うんだが、おまいらは正直どう思ってる?
メソッドが終了した後も値が残ってなきゃ困るだろ イベント駆動とかで 引数をやり取りするにしてもクラスにまとめないとやりにくいし
イベントハンドラ内のローカル変数って使い終わったらCloseするのがベストなの?
>>652 そういう値は呼び出し元のメソッドに参照渡しすればいい
WPFのテキストボックスで、非フォーカス時に選択範囲を表示させることってできる?
>>654 良く意味が分からん
イベント駆動のプログラムではメソッド全部終わって
次のイベントが来たらまた一からメソッドが立ち上がるだろ
前のイベントと次のイベントの間でどうやって値をやり取りするかという話になるだろ
静的なメソッドしか頭になさそう。
>>650 取れなかった。
んー、リフレクション使ってButtonBaseのGetFlagを0x2で呼び出せば取得できるみたい。
描画とかどうやってんだろ。
>>658 ありがとうございます。
リフレクションなんて触ったことないですが頑張ってみます!
よくそんなの見つけられますね^^;
{}の中で宣言した変数は{}の中でしか使えないよ。
>>651 OK.
ではフィールド使わずに任意の単位ベクトルを表すクラスを書いてみて。
NumericUpDownのvalueを変数aに代入する方法を教えてください
Decimal型だから任意の型にキャストすれば?
665 :
663 :2008/10/27(月) 20:04:54
private void button1_Click(object sender, EventArgs e)
{
int total;
int a = (int)numericUpDown1.Value;
int b = (int)numericUpDown2.Value;
total = a * b ;
string total_str = total.ToString();
textBox1.Text = total_str;
}
なんとかできました
>>664 ありがとうございました
public Form1( )
{
InitializeComponent( );
this.webBrowser1.Navigate( "
http://id.fc2.com/index.php " );
}
private void webBrowser1_DocumentCompleted( object sender, WebBrowserDocumentCompletedEventArgs e )
{
if ( this.webBrowser1.Url.ToString( ) == "
http://id.fc2.com/index.php " )
{
HtmlElement submit = webBrowser1.Document.All.GetElementsByName( "Submit" )[0];
submit.InvokeMember( "click" );
}
}
WebBrowserを使ってログインできるようにはしたんですが,
ログインする判断として、DocumentCompleted以外にいいイベントやアプローチ方法ありませんか?
ボタンは使わずに起動すると全自動でログインできるようにしたいです。
ご教授お願いします。
>>662 ああ、まぁインスタンス同士の四則演算させるときとかじゃ必要かもな。
でもそれは演算のオーバーライドとか特殊なケースなわけで一般的じゃないだろ。
演算のオーバーライド・・・
>>651 stringのように不変だったらいいのか?
>>669 そういうわけではないが、メソッド間の引数の渡しで済む物は極力それで実装すべきじゃない?
たとえメソッドの引数が10個20個になっても、その個数を減らすためだけに
安易にフィールドに頼るという方法は(・A・)イクナイ!!
>>670 だから前にもこのスレで書いた気がするけど、
普通はむしろ「安易にフィールドに頼ろう」なんて思わないよ。
世の中そういう(間違った)プログラミングが横行しているかのように
思っているのかもしれんが、それは君の妄想で事実じゃないと思う。
そんな奴あいねえよ。
むしろ余程センスのない人でもなきゃ、メソッドの引数を減らすために
フィールドを使うようなことはしないって。
フィールドの状態を把握できなくなるような馬鹿でかいクラスを書くのが間違い
引数が10個20個になったメソッドに可読性など存在しないに等しい クラスにまとめろ
スレチになるかもしれませんが、質問させてください。 Threadを用いてマルチスレッドで処理しているときの変数・配列へのアクセスについてなのですが、 複数のスレッドが全く同じ処理を行うとき、 int a = array[i]; //arrayは共通の配列 の一行が処理される間には他のスレッドは同じ要素、もしくは配列にアクセスできないのでしょうか? というのも、画像処理などで1pixelあたりの処理は軽いけど、画素が多い場合にどうしても重くなるので、 マルチスレッド化しようとforを複数のスレッドで分割してみたのですが、全く速度は変わらず… 粒度を細かくしようと object syncObj; int ti; ....... Monitor.Enter(syncObj); ti = i; i++; Monitor.Exit(syncObj); ....... としているのがだめなのかとも思い、処理する区間で分けてみても大して速度は変わらず orz 前者はともかく、後者でも速度が変わらないとなると、処理が軽すぎて何度も配列アクセスで待たされている と思うのですが、どうなのでしょうか?
また出たよ命令口調クンw これで言ってることがまともなら少しはカッコもつこうというものだが、 まったく意味不明で頓珍漢だからまさにみんなの笑いものw
676 :
674 :2008/10/27(月) 22:57:28
ちなみに、配列アクセス時にはlockは掛けていません。 元の配列は読み取り専用で書き換えるわけではないので…
メソッドって何ですか?
一応確認だがデュアルコアとかクアッドコアとかマルチ CPU を 使ってる…よな?
>というのも、画像処理などで1pixelあたりの処理は軽いけど、画素が多い場合にどうしても重くなるので、 >マルチスレッド化しようとforを複数のスレッドで分割してみたのですが、全く速度は変わらず… それマルチコアマシン? まさかシングルコアのマシンで速くならないとか思ってないだろうな? まあ処理内容にもよるが、どうも勘違いしてるように感じる。
だいたいそのMonitorの使い方はなんなんだ…
>>674 マルチスレッド使ったってスループットが上がるわけないんじゃないの
常識的に言って。
マルチスレッドで得られるものは「特定の処理によるCPU時間の占有の回避」だけでしょ?
ソースさらした方が早くないか
Parallel Extensions使ってみたいけどうちのPCシングルコア
684 :
674 :2008/10/27(月) 23:25:40
>>978 ,679
使用しているCPUは C2DのE6600です。
>>680 Monitorの部分は後からInterlocked.Increment()に書き換えました。
Interlockedクラスは後から知ったのと、なぜかlockステートメントよりもMonitorの方が速い
と思いこんでいたのでそんな書き方をしていました orz
>>681 CPUの処理速度よりもデータの転送速度の方がネックなのでしょうか?
処理は、単純にbyte配列の値を
temp[i] = 255 - array[i];
とかしながらコピーしているだけなのですが…
メソッドとは何かと聞いている
関数
>>684 それだったら、array/tempの前半と後半でスレッドに分ければいい。
互いに読み書きする領域がかぶらなければ排他制御は不要。
>Monitorの部分は後からInterlocked.Increment()に書き換えました。 それ何のインクリメント? まさかとは思うがループ変数のインクリメントじゃないだろうな…
追記、もしそうなら、根本的にスレッドの活用方法を間違ってる。
例えば
>>678 みたいにするもんだ。
>>687 ,689
試してみましたが、大して速度は変わらないっぽいです。
時間にして
シングルスレッドで0.07秒ほどの物が0.06〜5秒になるくらいですが…
2倍になることはなくても大体この程度高速化できればいい方なのでしょうか?
どんなソースで対象配列のサイズはどの程度なのよ。 メモリアクセスばっかの処理は、特にキャッシュに乗るサイズを超えるともう メモリ帯域がすべてになるから、ほとんど改善しなくても無理はない。
694 :
デフォルトの名無しさん :2008/10/28(火) 02:31:17
すみません。DataGridViewのSelectedRowプロパティがありますが、 一行ごとに配列に読み込んでくれる関数見たいのありませんか?
695 :
694 :2008/10/28(火) 02:39:27
自己解決しました。cellsプロパティがあるみたいです。 失礼しました。
>>691 というか、構造体はそういう物。
使い方や利便性などを考慮して、場合によっては
Sizeプロパティに加え、それにアクセスするためのWidth, Heightプロパティを定義する
>>696 >Sizeプロパティに加え、それにアクセスするためのWidth, Heightプロパティを定義する
コードにするとどんなかんじになりますか?
WPFじゃないほうのRectangleだと、まずWidth, Heightがあって // int _w, _h; public Size Size { get { return new Size(_w, _h); } set { _w = value.Width; _h = value.Height; } } みたいな感じになってたような
なるほど できました! トンクス
何が出来たんだ? 構造体にセッターなんか作ったってプロパティ越しじゃ使えんのに
701 :
674 :2008/10/28(火) 09:09:38
寝落ちしてた orz
>>693 いただいた回答を元にもう少し原因を探ったところ、どうやら画像サイズが小さくて
差が出にくかったようです。
テストは1024*768 32bitARGBの画像で行ったのですが、ぼかし処理等ではかなり時間が
掛かっていて、十分にマルチスレッドの効果が現れていたので(処理時間がほぼ1/2)、
このくらいのサイズからならマルチスレッドで処理すれば効果があるのかと思っていましたが、
色を反転させる程度の処理ではほとんど効果がなかったようです。
試しに4000*3000の画像でテストしてみると効果が出ていました。
早とちりすいませんでした orz
回答してくださった方々、本当にありがとうございました。
WPFとかわけわからん 本当に初心者なのか?
704 :
デフォルトの名無しさん :2008/10/28(火) 17:38:43
C#でできたソフトって、どんなものがありますか?
706 :
623 :2008/10/28(火) 18:33:34
教えていただいた方法で、自身のタブで開く方法は実現できました。ありがとうございます。 しかし、問題が新たに何点か浮かんできたので質問します。 1,AxWebbrowserを使うように変更したのですが、WebbrowserのときにあったWebbrowser.Document.Title等が使えなくなってしまいました。 どのようにすればタイトルや開いたページのソースコードを取得できるのでしょうか? 2.これはwebbrowserクラスでも同じくエラーになるのですが、作ったブラウザをVista上で動かすと、認証が必要なページにて 認証成功後に画面が切り替わるときに「Soft(仮)の動作を停止しました」というメッセージが出て、フリーズしてしまいます。 デバッガを使った結果、「0xC0000005: Access Violation」というエラーを吐いているようなのですが、ググっても解決法がよく分かりません。 なお、2の問題に関してはXPではエラーとはならず、認証後のページが一応開きます。 また、axwebbrowser.Visible = false; の状態だとフリーズはせず、 Visible = true; とした瞬間にフリーズとなります。 書き込んでいる本人もよく状況が分かっていませんが、よろしくお願いします。
1.については、mshtmlをCOM参照してDocumentをIHTMLDocument2とか3とかにキャスト そう言えばmshtmlってPIAあったっけ? なら.NET参照の方にあるかも
>>691 の引用先の人もなんか勘違いしてるねw
普通に考えればプロパティと相性が悪いのはむしろクラスの方だと思うけど。
少なくともプロパティで取得するような「状態」を表すオブジェクトは
構造体にする方が余計な勘違いを誘わない点で無難。
709 :
623 :2008/10/28(火) 19:28:13
>>707 mshtmlをCOM参照して、IHTMLDocument2にキャストしましたが、
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と出てエラーとなってしまいます。
mshtml.IHTMLDocument2 hd = (mshtml.IHTMLDocument2)axWebBrowser1.Document;
label1.Text = hd.title;
このように書いています。
どのように書き直せばいいのでしょうか?
で、どれがnullなの? axWebBrowser1? axWebBrowser1.Document? hd? ht.title?
711 :
623 :2008/10/28(火) 19:42:56
>>710 申し訳ありません、解決しました。
axWebBrowser1がnullだったのでおかしいなと思い、呼び出し位置を変えてみたところ、今度はきちんと動きました。
どうやらページに移動し終わる前にIHTMLDocument2に代入しようとしていたようです。
すみませんでした。
712 :
デフォルトの名無しさん :2008/10/28(火) 20:20:01
>>704 以外に少ないんだな・・・
C#ってまだまだマイナーなのかな
以外が少ないなら以下自粛
以外に多いですよ .NET 2.0 Framework再頒布パッケージが必要ですと書かれているものの殆どがC#だと思います
715 :
デフォルトの名無しさん :2008/10/28(火) 20:52:31
そうか。 今のソフトってまだCとかC++とかが主流なのかな。 今から趣味程度にソフト開発始めるなら、C#でもいい?
うるせえよ、ガタガタ言ってる暇があったらソフトの一本でも作れよ
骨格はC#で、フォームといったインターフェースは簡単なVBで、という人はどのくらいいる?
それなら全部C#で作るだろ IDEはC#のほうが便利だし
インデクサってクラスに1こしか作れないの? クラスに配列が2個以上あったらどうするの?
>>720 プロパティとして外に出せばいいんじゃね?
どっちもどっちだな。 デザイナはどっちもかわらんし、エディタはVBのが快適な点もある。
C#でポトペタすりゃいいじゃん
>>720 > インデクサってクラスに1こしか作れないの?
言ってる意味がわからん。
>>725 CLIは名前つきインデクサをサポートしていて、
VB.NETではそれを使用できる。
>>723 そもそも VB はソースの可読性に難があるからな。
IDE 側で頑張って可読性を向上させてやろうって努力はよく分かるんだけど、それでもね…。
まあこの辺は人によって違うだろうけど。
>>726 微妙に話が噛みあってないような気がするんだけど
実行速度ってネイティブC/C++ >>> C++/CLI = C# = VBって感じなの?
VBは使い方によっては遅くなる
インデクサをオーバーロードしたいって事?
引数つきプロパティのことっしょ
クラス内に配列が2こ以上ある場合 インデクサはどう定義すればいいん?
C#でインデックス付きプロパティを原則禁止して、 特別のケースとしてインデックサを設けているのはC#という言語の設計思想によるもの。 文句があるならヘルスバーグにメールしてくれ。 それはおいといて、VBでインデックス付きプロパティをもつクラスを 作ってしまってC#から使うことになった場合はset_, get_ の内部名を直接指定する。 x.set_NamedProp(1, "nnnnn"); s = x.get_NamedProp(1);
>>733 インデクサを持った型のインスタンスを返すプロパティにする
イテレータ使えばいいんじゃね?
今後の展開 XXX:: デフォルトの名無しさん [sage] (ry class HogeNest { property Hoge[] FooRoom { get; set; ready;} } で良いんじゃね YYY: デフォルトの名無しさん [sage] (ry class HogeCollection:List<Hoge> {..} class HogeNest{ (ry) } もありかも ZZZ: デフォルトの名無しさん [sage] (ry >>XXX >>ZZZ ガイドライン違反 、配列を外から云々(ry
>>734 > C#でインデックス付きプロパティを原則禁止して、
どういうこと?
プログラムからWebブラウザ内のプルダウンメニューから任意の値を選択するには、どうすれば良いでしょうか?
配列を直接返すと外側で境界チェックしないといけないから面倒だよね これがガイドライン違反 、配列を外から云々(ryってやつ? class Program { static void Main(string[] args) { Hoge h = new Hoge(); if (h.A != null) { for (int i = 0; i < h.A.Length; i++) { Console.WriteLine(h.A[i]); } } } } class Hoge { int[] a; int[] b; public int[] A { get { return a; } } public int[] B { get { return b; } } }
ぬるぽ
Optional and named parametersは全体で使えるようだが、 Indexed property はCOM専用っぽい記述になってる。 どうなんだろう。
dynamic objectじゃラムダ式は使えんのか 全然ダメじゃん
>>745 ラムダと dynamic、用途がまるで違うんだが。
>>744 「C# が持ってない概念に依存しない COM 呼び出しができます」じゃない?
つまり、COM 専用な概念は dynamic では呼べない。
>>746 Rubyユーザーに馬鹿にされるところが目に浮かぶよ俺は
COM互換はVBにやらせる方針なんだろうと思っていたよ。 今回は目玉が少ない気がする。まだ発表してない要素があるのだろうか。
>>651 「クラスの状態」を保持するのに、フィールドを使わずにどうやって実装するの?
たとえばここに色を現わすColourというクラスがあるとして、そのインスタンスのひとつが
現在「赤」なのか「青」なのか、どうやって状態を保持する?
dynamic object使う気ないしCOMも別に使わんしなあ in T、out Tは使いそうだけど
752 :
デフォルトの名無しさん :2008/10/29(水) 12:20:43
DataGridViewを使って、商品管理ソフトを作っており、 検索も追加/編集も両方同じDataGridViewを使おうと思っています。 が、検索するときに編集してしまったり、追加してしまったりしたくないのです。 最初、タブを2つ作って、そのタブの下に(中ではなく)DGVを配置していたのですが、 タブを切り替えるたびに、検索したあとの検索結果を戻したり、編集できなくさせたりするのが面倒で、 検索機能だけもったアプリ、追加・削除・編集をできるアプリ、と2つにわけました。 わけたのですが、やはりスマートじゃないかなと思い質問してみました。 答えは無いと思いますが、みなさんならどんなインターフェイスにしますか?
Pen pen のような ClassName classname のような宣言ができるんですが 避けた方がいいんでしょうか?
>>750 > 現在「赤」なのか「青」なのか、どうやって状態を保持する?
メソッドの引数で伝達していけばいい
>>651 そういうことを考えてくと、クラスの内部であってもプロパティからしかアクセスできない変数って言うのが欲しくなる
出来ないよな?そんなこと
>>754 ウィンドウ作るのに一体いくつの引数があればいいんでしょうか
>>755 class baseClass
{
private Object hiddenField;
protected Object ProtectedProperty{ get{ return hiddenField; } (ry)}
}
class mainClass:baseClass
でやれば出来ないこともないとは思うが、そこまでして保護する必要性もないと思う。
>>752 別に一つのDGVで完結させても面倒なことは何一つ無いと思うが。
760 :
757 :2008/10/29(水) 13:12:07
>>651 知らないうちに値が書き換わっているのは確かに怖いが
外部からの理不尽な書き換えをなくすために隠蔽があるわけで、外部から手が加えられないなら問題ないだろ。
クラス内部での妥当な状態変化には寛容であるべき。
>>759 mainClass(命名規則がおかしいな)ではhiddenFieldは隠蔽されない?
>>754 それってクラスにする意味があるの?
ただの関数に思えるのだが。
>>754 たとえば、
1.フォームが生成されたとき、デフォルトの色を「赤」に設定する。
2.ボタンが押されたら、色を「青」に変更する。
1と2のイベントの間、「赤」という情報はどこに保存するの?
>>762 ボタンが押されたときに「青」という状態を変数にしてメソッドに渡せばいいんじゃね?
>>760 クラス内フィールドという意味が良く分からんが、
Publicなフィールドが必要ないって意味なのかな?
それならまだ分かるんだ。
でも
>>651 の言っているのはPrivateなフィールドすら必要ないと言っているように聞こえるんだ。
>>763 じゃあボタンが押されたときに、フォームの色が赤だったら青に、
青だったら緑に、緑だったら赤にするようにしたいときはどうする?
>>764 現在のフォームの色を検出するメソッドをつくって、そこから得られた色を
ボタンクリックのメソッドに渡せばいいんじゃね?
>>765 >現在のフォームの色を検出するメソッド
これどうやって実現するの?
現在のフォームの色は何者が保持してるの?
そもそもまともなクラス作ったことないアホだろ
以降
>>760 に納得できない人の間で無限ループの悪寒
状態を保持する必要があるものは必ず出てくる。 グローバルなんて言ってんのはそもそも適切なクラス設計が出来てないからだろう。
>>763 ボタンが押されるまでは「赤」で「あり続ける」必要があるのだが、その「赤」という情報は
どこにあるの?
Windowsが描画を要求したとき、色の情報が存在しなければ描画できないよ。
>>769 同意。
フィールドが存在しない(状態を保持しない)クラスなど、関数ライブラリと変わらない。
そもそもインスタンスを生成する必要がないから、全部staticでよいことになる。
それなら構造化プログラミングだけやってればいいわけで。
流れをぶった切って質問です。 複数のテキストボックスとOKボタンを配置して入力フォームを作成しています。 タブでフォーカス遷移させながらユーザーに入力させたいのですが、 テキストボックスのどこにフォーカスがあってもEnterが押されたらOKボタンのクリックイベントが発生するような よくある形の入力フォームにしたいです。 当然テキストボックスのPreviewKeyDownイベントでOKボタンのクリックイベントを呼び出せばいいのですが、 このときにOKボタンにフォーカスが当たっているように見せたいです。 つまり、textbox1にフォーカスが当たっているときにも、OKボタンの外枠が青っぽくなるようにしたいです。 これも良くある入力フォームの形だと思うのですが、どのように実装したら良いでしょうか。
this.ForeColor
775 :
623 :2008/10/29(水) 14:01:10
axWebbrowserで開いたページがよく文字化けしているので、 button を押すとaxwebbrowserで現在開いているページのエンコードを utf-8 に変えたいのですが、 どのようにすれば実現できるのでしょうか?
>>753 それはみんな普通にやってるんじゃ。
MSDN でもそういうコード見かけるし。
なんとか.Encode("UTF-8")
780 :
623 :2008/10/29(水) 14:15:26
>>778 ,
>>779 axwebbrowser. の直下には見当たらないので困っています。
webbrowserなら、webbrowser.Document.Encodingで設定できるのですが・・・
mshtml.HTMLDocument myDocument = (mshtml.HTMLDocument)axWebBrowser1.Document; myDocument.charset = "utf8";
782 :
623 :2008/10/29(水) 14:30:19
>>781 「引数が無効です」というエラーが出て終了します。
myDocument.charset = "utf8";
の代入部分でエラーを出しているようです。
頭の無いコピペマシーン
ワロタ ちょっとハイフン忘れただけじゃんかよ、utf-8でやってみ
>>783 ,
>>784 書き込んだ後で気づきました・・・
コンパイルは通るようになりましたが、エンコードの変更がページに反映されません。
axwebbrowser.Document = myDocument;
としようとすると、「プロパティまたはインデクサ 'AxSHDocVw.AxWebBrowser.Document' は読み取り専用なので、割り当てることはできません」というエラーが出てしまいます・・・
Refresh()でいけるだろ。 ページそのものにcharset指定があると戻されるが。
← →
788 :
デフォルトの名無しさん :2008/10/29(水) 15:20:05
C#でプログラム書くとき、コードをどこに書けばいいかわからん。 イベントハンドラとかは、Form.csに自動で追加されるから、そこにそのまま記述してるんだけど、 ほかの処理とかも、どんどんForm.csにメソッドとして追加していけばいいのか?とか悩む
そうですか。
クラスとして完結できるものはクラスにしていけばいいんじゃないかな。 自分も気になるんだけどたまにWin32とかいうクラスを作って その中にAPIの宣言を纏めて書いているプログラムをたまに見かけるけど よくある手法? クラス毎に必要なAPIだけ記述しているけど、当然クラスによっては 同じAPIを宣言しているものもあって、オブジェクト指向的にはどうなんだろう。
>>788 最初のうちはそれでいいんじゃないの?
自作クラスとかカスタムコントロールを使うようになると、たとえばMyClass.csとかの
別のファイル(またはソリューション)にユーザー定義のイベントや、フィールド、メソッド、プロパティ
やらを実装していく形になる。そしてそれが肥大化した場合にフォルダ分けをしてソースコードを整理することになる。
それによって自動的に関数ライブラリとユーザーコントロールとフォーム系とその他のクラス等、
それぞれのnamespaceが変わってくることになる。
アンマネージド関数の宣言は NativeMethods/SafeNativeMethods/UnsafeNativeMethods のいずれかのクラス内にまとめろってFxCopが言ってた
Program.cs ってなんのためにあるの? 昔のC#には無かった気が駿河
>>793 こういうやつがでてくるからコンソールアプリから勉強しろと言いたくなるんだな。
795 :
デフォルトの名無しさん :2008/10/29(水) 16:10:20
>>794 こういうやつがでてくるから説明できないなら黙ってろと言いたくなるんだな。
昔はForm1.csにMainまであったんだっけ
>>786 Refresh()で更新をすると、こちらが指定したエンコードが元に戻るようで、結局更新されないみたいです。
Form本体、axwebbrowser両方ともにRefresh()してみましたが、駄目でした。
質問です。 htmlファイルをFile.ReadAllText()で読み込んで、それをプログラム上で編集後に 再度htmlファイルとして保存し、それをブラウザで表示するプログラムを作っています。 以下にコードを示します。 //ソースを読み込む string htmSource = File.ReadAllText(filename); //----------編集処理--------------- //新しいhtmファイルの保存 File.WriteAllText(newFileName, htmSource); //一時htmファイルを開く System.Diagnostics.Process.Start(tmpFileName); このときにブラウザで表示しようとすると文字化け?のようなことが起こります。 エンコードの問題だと思うのですが、その辺が疎くて分かりません。 一応SakuraEditorで元のhtmファイルを開いてみたらエンコードがシフトJISのようでした。 しかしながらSystem.Text.EncodingにはシフトJISがないようです。 どのように対処すればよいか教えて下さい。
800 :
799 :2008/10/29(水) 17:05:21
コードに不備がありましたので訂正 //ソースを読み込む string htmSource = File.ReadAllText(filename); //----------編集処理--------------- //新しいhtmファイルの保存 File.WriteAllText(newFileName, htmSource); //新しいhtmファイルを開く System.Diagnostics.Process.Start(newFileName);
801 :
799 :2008/10/29(水) 17:18:56
すみません自己解決しました。 //ソースを読み込む string htmSource = File.ReadAllText(filename, System.Text.Encoding.GetEncoding("Shift_JIS")); //----------編集処理--------------- //新しいhtmファイルの保存 File.WriteAllText(newFileName, htmSource, System.Text.Encoding.GetEncoding("Shift_JIS")); //新しいhtmファイルを開く System.Diagnostics.Process.Start(newFileName); これでOKでした。 スレ汚し失礼しました。
>>798 に追記です。
目的ページには効果が無かったのですが、関係の無いページで試してみると変更されました。
目的ページには記述が見当たらないのですが、どこか別のところに指定があるようです。
どうやら無理っぽいので諦めたいと思います。
803 :
デフォルトの名無しさん :2008/10/30(木) 00:55:51
foreach (string s in contentsText) ~~~~~~~~ { if (s == "★") { cnt += 1; } } エラー1 型 'char' を型 'string' に変換できません。 foreachの下に下線が付いて↑のコンパイルエラーになってしまいます。 contentsTextはString型文字列です。 どんな原因が考えられるでしょうか?
↑ まんまじゃねーか
foreach (char c in contentsText) { if (c == '★') { cnt += 1; } }
文字と文字列の違いが分かってないからだ
807 :
803 :2008/10/30(木) 01:04:24
StringクラスはCharオブジェクトのコレクションってことですね。 すいません、理解しました。 文字列をコレクションとしてループさせる場合はStringとして扱うことはできないでしょうか?
文字列をforeachに渡したからといって行単位で処理してくれるわけじゃないぞ contentsTextをSplitしなきゃダメ
HtmlDocumentについて質問です。 >VB Dim Element As HtmlElement = WebBrowser1.Document.All("last") >C# HtmlElement Element = WebBrowser1.Document.All("last"); VBのコードだと指定したIDをHtmlElementとして拾えるのですが、 C#だと「実行不可能なメンバ 'System.Windows.Forms.HtmlDocument.All' をメソッドのように使用することはできません。」 というエラーになります。 できればコレクションではなく、IDを指定してランダムアクセスしたいのですがご存じの方お願いします。
>>809 よくわからんけど["last"]じゃねーの?
foreachって{}使わないでもなんか使えるらしいぞ
C系言語の基本 ちなみにループはもちろん,usingやfixedも{}省略可
C++のコードからC#のコード(dll)呼べますか?
はい。
C++/CLI COM 逆P/Invoke 上から順に検討しましょう
めんどそうなので 全部c++で書こうと思います
「C++からC#のdll」でググれ
便乗質問なんだけど,C++/CLIでアンマネージC向けのDLLって作れるの? 逆P/InvokeやCOMは無しで
C#がからまないとさすがにスレ違いだろ…
textBox1.Cut();やCopy();そしてPaste();まであるのにDelete();が無いのは何故? 長いコード書かせるための罠ですか?
ん?数文字長くなるだけだろ
= "";
これはマイクロソフト側の不備ですよね こんな単純なメソが無いなんておかしいし、美しくない
やってみたけど、うわあこれ長い 拒絶反応が出たあ で本題ですけど、stringの""とnullって何が違うの?
stringが参照しているnullは文字列の顔を装った化け物 ""は空文字列という真っ当な文字列
>>823 文句があるなら継承して実装する。
何のためのOOPだ。
ふらっとC# 開いているIE7のURLを知りたいです。 次のコードで、プロセス名やプロセスのパスは取得できました。 string ProcessName = "iexplore"; Process[] allProcesses = Process.GetProcessesByName(ProcessName); foreach (Process oneProcess in allProcesses) { Console.WriteLine(oneProcess.MainModule.FileName); } このあと、URLを知るには、どうしたらいいですか?
>>827 プロセスからは無理。
ShellWindows を列挙して、LocationUrl を取るってのが COM 的な方法。
ウィンドウを列挙して、アドレスバーなりから取るのが Win32 的な方法。
どちらが初心者におすすめですか?
前者
文字列が空かを求める処理を書く場合、 1. str.length<0 2. str=="" 3. str==string.Empty があるかと思うのですが、可読性が高いのは一般的にどれなんでしょうか? 処理速度を求めっれば1番 プログラムの綺麗さを求めれば3番 と思っていますが、個人的には2番が見やすいかなと
832 :
831 :2008/10/30(木) 11:09:47
1. str.length==0ですね^^;
まずShell32.dllを参照で追加しました。 次にmsdnでshellwindowsを検索しました。 が、あまり有効な情報がなく。 ShellWindows shellWindows = new ShellWindowsClass(); とかだと、参照が不足しているようなのですが、なにを追加すべきですか?
string.Equalsと""では""のほうが速いんだっけ ==とLengthでは,==ははじめに文字列の長さを比較するようになってるからほとんど変わらないはず
しかし聞いてるのは可読性 俺はいつも==""だな 逆も!=""
>>833 ShellクラスのWindowsメソッドだったっけ
// Shellは厳密にはinterfaceだったはずだけどなー
>>833 あと、SHDocVw を参照設定して、こんな感じ。
エクスプローラも含むから気をつけてね。
Shell sh;
SHDocVw.ShellWindows o;
sh = new Shell();
o = (SHDocVw.ShellWindows)sh.Windows();
foreach( InternetExplorer ie in o )
{
MessageBox.Show(ie.LocationURL);
}
>>837 ありがとうございます。
SHDocVwライブラリは、参照-COMで、Microsoft Internet Controls-ieframe.dllがそうなんですね。
名前がぜんぜん違うので、見つけられなかったです。
InternetExplorerの参照がないといわれています。
これはなにを参照すればよいでしょう?
SHDocVw.InternetExplorer
840 :
デフォルトの名無しさん :2008/10/30(木) 13:35:45
せっくすしてぇょ〜
空文字列かどうかの判定にローカリゼーションが入る余地は無いと思うが 後から「これしか入ってなかった場合は空文字列扱いね」はあるかもしれないな
> 後から「これしか入ってなかった場合は空文字列扱いね」はあるかもしれないな つっても普段からこんなのまで考慮してたらキリがない
String.IsNullOrEmpty(s)って誰も言わないのは、なぜ?
JAVAでいう「ヌルポ」に相当するものってC#だと何( ´∀`)?
空文字列かどうか、とnullまたは空文字列かどうか、は別の問題だから
>>839 、837
できました。ありがとうございました。
北海道か青森の場合、と条件を書くときって、 if (TextBox.Text.Contains("北海道|青森県")) でいいんだよね?
Stringクラス自体には正規表現の機能は無い
if (TextBox.Text.Contains("北海道")) | (TextBox.Text.Contains("青森県"))
C#のプログラムでは、なにかを使う場合には、宣言をする。 private useFolder(string FolderName) string[] mails = Directory.GetFiles(FolderName); sh = new Shell(); みたいに。 ひとつめは、メソッド名での定義。 ふたつめは、変数(データ型)での定義。 最後は、コンストラクタを呼び出して新しいオブジェクトを作成するnew演算子による定義。 こんな理解でよさそうですか?
>>851 なるほど。それでヒットしなかったんだ!
thanks.
ひょっとしてこれって、配列を使うとスマートだったりする?
わからん! object sender, EventArgs e の意味を教えてくれ!
>>854 たとえばボタンがクリックされたとき、ボタンクリックイベントが呼び出されるわけだが、
ただ「ボタンがクリックされたぞー」と呼ばれても不親切だ。
そこで、クリックされたボタン(sender)を教えてくれているわけ。
「EventArgs e」が必要になるのは、もうちょっと後だろう。今は知らなくて良い。
>>853 if (Regex.Match(textBox1.Text, "北海道|青森県").Success)
とか
つまりsenderは俺がオナニーしたことを告げ口するわけですね!
>>854 ふむ。だれがだれに教えるの?
乏しい理解によれば、
メソッド(引数)
と書くと、その引数でそのメソッドを処理して、答えを外に返してくれる。
とすると、senderを押したってことは、外になんか返ってくるわけ?
たとえば、
private void button_Click(object sender, EventArgs e)
とあるとき、
button_Click(this, EventArgs.Empty);
と実行すると、なにか返ってくるの?
でも、返ってくるとしたら、returnになんか値を入れとかないとだめなんじゃなかったっけ?
あと、ぶっちゃけ()を空にしちゃだめ?
っていうか空にしても動いた気がするんだけど。
voidなら空OK
>>858 > ふむ。だれがだれに教えるの?
イベント起こしたものが、イベントを受け取るものに。
例えばボタンのクリックなら、Clickイベントを起こしたもの(== Button)が sender。
受け取るものってのは要するにbutton_Clickメソッド。総称イベントハンドラ。
> と書くと、その引数でそのメソッドを処理して、答えを外に返してくれる。
> とすると、senderを押したってことは、外になんか返ってくるわけ?
senderを押す? って何?
button_Clickメソッドは1つでbutton1.Clickとbutton2.Clickの両方のイベントハンドラとすることができる。
でもそのままだとどっちのボタンのClickによって呼び出されたのか区別がつかない。
なのでsenderで区別する。
> たとえば、
> private void button_Click(object sender, EventArgs e)
> とあるとき、
> button_Click(this, EventArgs.Empty);
> と実行すると、なにか返ってくるの?
イベントハンドラはイベントによって自動的に呼び出されるメソッド。
基本的に自分で呼び出すもんじゃない。
それに返値はvoidだろ。
> あと、ぶっちゃけ()を空にしちゃだめ?
> っていうか空にしても動いた気がするんだけど。
イベントハンドラとして使用できない。
ButtonのClickイベントはEventHandler型で、このデリゲートと引数が一致していないといけない。
>>856 IsMatch使おうよ
>>858 イベントハンドラを呼び出すのはイベント発生元のオブジェクト
プログラマがイベントハンドラを呼び出すコードを書くことはまずない
>>858 > と実行すると、なにか返ってくるの?
private void button_Click(object sender, EventArgs e)
 ̄ ̄ ̄
だからvoidが返ってくる。つまり、何も返ってこない。
goto ok
コピペ君って馬鹿だな、まで読んだ。
senderは今でも何のためにあるのか分からないな EventArgsに集約してe.Senderでアクセスできるようにすればいいのに
イベント起こす人がEventArgsを用意するとは限らないからじゃないかな
>>866 あえて言えば、
(1) 何も付加情報がないときはnullで済ませたい。
というイベントを発火する側の要求と、
(2) イベントの発火人の情報の受け渡しは強制したい
というリスナ側の要求の折衷じゃないのかな。
>>860 メソッドとイベントハンドラの区別がつかない自分に気づいた。
カタカナ語に弱い。
あ、イベントによって自動的に呼び出されるメソッドのことをイベントハンドラというのか。
イベントってのは、ボタンを押したりとかの動作のことでしょ。
ってことは、手動で呼び出すメソッドのことはメソッドというのか?
あり? でもメインメソッドはメインメソッドじゃなかったっけ。
頭が煮え立ってきたので、今日はここまで。
理解が遅くてすまん。
ありがとう
メソッドってのはメンバ関数のことだよ
Main() もコールバックというかイベントハンドラっぽい気がしなくも無いね。 ただ定義だけして CLR? に呼んでもらう感じだし。 (Main() のように自分で直接呼び出したりはしない)
>>869 メソッドのうち、イベント時に呼ばれる特殊なメソッドをイベントハンドラと呼ぶ。
「自動車」と「消防車」の関係に同じ。
火事の時に呼ばれる特殊な自動車を消防車と呼ぶが、火事以外の平時に消防車が走行しては
ならないということではない。
>>872 そういう訳のわかんない説明は、オブジェクト指向を動物に喩える話と同じぐらい
ありがた迷惑なんじゃないかと思うよ。
つーか特殊なメソッドとか誤解を招くようなこと言うなよ。
イベントドリブンの考えなんて普通にプログラム書いてれば自然とわかるから
心配いらん。
オブジェクト指向を動物に喩える話を批判する奴がよく居るがなんでなんだぜ
そいつに理解できないから
>>868 eにnull渡しちゃダメ
EventArgs.Emptyを渡すお約束
>>852 private useFolder(string FolderName) //メソッドの宣言
{
//string[]型の変数mailsを宣言(mail=右辺 と定義しているわけではなく,mailに右辺の値を代入している)
string[] mails = Directory.GetFiles(FolderName);
//コンストラクタの戻り値をshに代入。もちろんsh=new Shell()と定義しているのではない。
sh = new Shell();
}//{ }内はメソッドの定義
コンストラクタの戻り値?
コンパイル後の表現は全然違うけど,あくまでC#の形式的な話としては コンストラクタは新しいインスタンスを返す関数のようなものだろ
new演算子が、と言うほうがまだいい、個人的な意見だけど。
また初心者スレで誤解を招くような事を書きやがって
static Hoge operator new() { Hoge obj = まっさらなHogeのインスタンスを作成; obj.コンストラクタ(); return obj; } イメージとしてはこんな感じでおk?
質問です。 class{ Method01(){InitializeComponent();} Method02(){ } Method03(){ } } とあるとき、Method01〜03で共通に使う変数は、メンバ変数として、クラス直下で指定すると思います。 でも、 string inputText = TextBox.Text は、Method02の内部でないと指定できなかったりします。 このinputTextをMethod03で使うにはどうしたらいいんですか? ご指導ください。
・inputTextをメンバ変数にする ・Method03に引数として渡す
Method02がinputTextを返す
>>882 string inputText; //フィールド
void Method2(){
inputText = textBox1.Text;
}
void Method3(){
string str = inputText + "これでつかえたね";
}
>>873 イベントハンドラが特殊じゃないってんなら、privateなのに自クラス以外から参照できる理由を
説明してくれ。
イベントハンドラ用に定義したのメソッドそのものはいたって普通のメソッドだぞ そのメソッドをイベントハンドラ用のデリゲートにバインドすることで, メソッドをあたかもオブジェクトのように扱えるようになる javaなんかではprivateな内部クラスでインターフェイスを実装して, そのインスタンスをイベントに登録したりするけど,デリゲートはそれを簡略化した仕組み
> privateなのに自クラス以外から参照できる ねーよwww
>>886 >privateなのに自クラス以外から参照できる
コード例をたのむ
>>885 なるほど。ありがとうございます。
class{
Method01(){InitializeComponent();}
Method02(){
if() {string inputText = TextBox.Text}
}
Method03(){string inputText = TextBox.Text}
}
の場合はどうなります?
Method02のifが成立しているときは03の定義を省略できますが、03の定義を省略して次のようにすると、
class{
string inputText;
Method01(){InitializeComponent();}
Method02(){if() {inputText = TextBox.Text;}}
Method03(){string str = inputText;}
}
ifが成立しないときは、Method03が成り立たなくなってしまう気がします。
>>890 やりたいことの意味が分からん。
テキストボックスのテキストをフィールドとして使いたいクラスがあるのだとすれば、
単にテキストボックスのTextChangedイベントでinputTextに代入していればいいだけの
ことじゃないの?
コードの書き方と云々以前の問題で、設計自体が既に破綻しているようにしか見えない
何が言いたいのかわからないけどそういうもん インスタンス変数を使うなら「状態」を意識しないといけない
あわせて、コンストラクタの sh = new Shell();などを Method01-03で共通で使うには、どのようにしたらよいでしょうか?
shをフィールドにする まったく同じこと
初心者です オススメのメットホッド教えてください 当方女子高生です
メットホッド の検索結果 約 5 件中 1 - 6 件目 (0.23 秒) 少数派だな
メットホッドって何??と思ってググッたら、methodの事なのか・・
パラメータと(ローカル)変数の違いが分かりません 教えてください
int Method ( int a ) // a・・・パラメータ(引数) { int b = a; // b・・・ローカル変数 return b; // 戻り値 } パラメータ(引数)・・・関数の外部(呼び出し元)から受け取った変数 ローカル変数 ・・・関数の内部でのみ使われる変数 戻り値 ・・・関数の外部(呼び出し元)に返す変数 パラメータや戻り値が 呼び出し元 と関係する(受け取り、返す)のに対して ローカル変数は関数の内部で完結し、呼び出し元から見られる事がない。
パラメータ(仮引数)だって呼び出し側からその名前でアクセスできないぞ
903 :
デフォルトの名無しさん :2008/10/31(金) 09:09:30
引数とグローバル(?)変数の違いって意味じゃない?
パラメータもローカル変数だろ
特殊なのはイベントハンドラではなくてデリゲートだな。 デリゲートにして引き渡せばprivateなメソッドを外部から呼ぶことができる。
C#でおk
Settings.Default.Setting1ってのがグローバル変数なの? 初心者各位もとい諸君らが求めるそれに限りなく近い挙動だと思うんですけど
グローバル変数のようにも使えるよ勿論 それをいうならシングルトンなんか全部実質グローバル
>>908 シングルトンだね。
Settings がクラス名
Default がファクトリー
Setting1 がSettingsのプロパティ
インスタンスの作成は制限されてないからシングルトンというよりデフォルトインスタンスでしょ たいがいシングルトンは本来の目的とは違ってグローバル変数として使われるけど
シングルトンが出てくるのは多分設計ミス
Genericを使ったコードを書くと、「using System.Collections.Generic;」の行で error CS0234: 型、または名前空間名 'Generic' は、クラスまたは名前空間 'System.Collections' に存在しません。アセンブリ参照があるか確認してください。 とエラーが出てしまうんですが、何が原因なのでしょうか? (Genericを利用しないコードは、問題なくコンパイルできます) パスを通すために、sdkbars.batを実行してから再起動もしたんですが、何も変わりません。
914 :
913 :2008/10/31(金) 13:05:15
すいません、質問スレに書くはずが、誤爆してしまいました
ここが質問スレじゃなかったら何なのw ジェネリックが使えるのはVS2005以降だけどそれはわかってるよね?
>>915 相談室スレに書こうと思ってたんですが、質問OKなら安心しました
誤爆とはいえ向こうにも書き込んでしまい、マルチのような状態になってしまって申し訳ない
言われてみれば、バージョンが古いのかも知れません。調べてみます。
>>915 確かに、バージョンを3.5にしたら解決しました。ありがとうございました。
Form1.Text = contentsTitle + " - " + Application.ProductName; こんな感じのアプリケーションよくありますよね それなのにApplicationにProductNameWithSeparatorが無いのはおかしいですよね これがあれば前述の式は次のような式に様変わりします Form1.Text = contentsTitle + Application.ProductNameWithSeparator; まさにこれが必然であるべきと言わざるを得ない国際標準規格に相応しい式が今ここに出来ています しかしながら誠に遺憾ではありますが、実はあなたがこの素晴らしい式を使うことは出来ないのです
>>919 よくわからんけど、何か気の利いた面白いこと言ってるつもりだったりするのひょっとして
>>921 ふらっとスレなんだからもう許してやれよw
あんたも粘着質だな。
ちなみにVBなら適当なインターフェイスを被せれば普通にできるな。
×許してやれよ ○許してくれよ
アホか
アホちゃいまんねん
ペーでんねん
>>917 SDK使ってるの?
VC#2008Express使おうよ
>>927 > VC#2008Express使おうよ
無料版はいろいろ制限がきつくてね(´・ω・`)
SDKと比較した制限なんて無いよ あたりまえだけどSDKでできることは全部できる
そういう事は制限が気になるほどの知識を付けてから言え
徒労好きな奴なんだからほっとけば
933 :
デフォルトの名無しさん :2008/10/31(金) 23:46:32
DataGridView使うときはSDK使った方がいいよ。理由は…
意味わからん デザイナ使わずにSDKと同じようにコードから使うこともできるだろ
無料版はいろいろ制限がきつくてね(´・ω・`)
いろいろとは?
>>921 コントロールがイベントハンドラを呼び出す場合とか?
実装がどうなってるか知らんけど。
>>937 デリゲートはオブジェクト参照+関数ポインタ
インスタンス化するときには対象のメソッドへのアクセス権が必要だからカプセル化は保たれる
939 :
デフォルトの名無しさん :2008/11/01(土) 13:31:47
c++風に表現すると、 クラスfooのメンバに クラスhogeのインスタンスへのポインタを 持たせる、ってことはC#でできるんでしょうか? どうやって書いたらいいか教えてください。
class foo { hoge hoge; } クラスは参照型だからこれでおk
全ソースで共通で使えるエイリアス作成はできるでしょうか? やりたいことは、 using DWORD=System.UInt32 と同様。 これだと、全ソースファイルに書かなきゃならなくて。
できませんというかできないようにしてあります
クラスを別個の .cs ファイルに記述する際、先頭のnamespaceはどうしてる? メインプログラムのnamespaceと同じ名前にしてる? それとも今後他のプログラムでそのクラスを使用する際の汎用性を考えて 独立したnamespeceを付与して、メインプログラムの中で using 〜 を記述するか、 そのクラスを呼び出す際にnamespeceまで含めたフルパスで呼び出すようにしてる?
>>943 何が言いたいのかよく読み取れないが、
恐らく単に君が名前空間の意義がわかってないだけなんじゃないのか?
namespaceは同じにしてフルパスで呼び出さないようにしてるな
同じプロジェクト内で全然関連のない名前空間の宣言が出てくるのは変だろ 使い回すならクラスライブラリにするし
947 :
943 :2008/11/01(土) 16:00:38
そ、そうなのか・・・ するとそのクラスを他のプロジェクトで使用する際は先頭のnamespaceのところを そのプロジェクト共通のnamespaceに書き換えてから使えってことね?
いや
>>946 の言ってることは変だから真に受けない方がいいと思うけど。。
だから名前空間の目的を理解してさえいれば、ネーミングや階層構造で迷うことはあっても
方針で迷うなんてありえないと思うんだが。。
なんで一番肝心なこと(名前空間の目的って何?)の理解を後回しにして
意味のない質問をするんだろう。
別のプロジェクトにソースファイルをコピーして使うなら、 どうせその時点から別物なんだから名前空間なんてどうでもいいと思うんだよね むしろそれぞれ変えた方が、あとでややこしくならないかも
950 :
949 :2008/11/01(土) 16:38:25
自分でも何言ってるのかわからないので 別のプロジェクトにクラスAのソースファイルをコピーすると、二つの別のバージョンのAができることになる 2つはそれぞれ個別に編集される可能性がある別物なんだから、完全に同じ名前を持つのは不適切じゃないか? 同じソースファイルを二つのプロジェクトで共有するのなら話は別だけどお勧めはしない
951 :
デフォルトの名無しさん :2008/11/01(土) 16:53:49
DataSetオブジェクトを空にするというか、一度読んだら常駐してもらわなくていいので データを読み込んだらメモリ空間から消すにはどうしたらいいの?
952 :
951 :2008/11/01(土) 16:57:08
スマソ。DataSet.Clear()があった。自己解決です><;
953 :
デフォルトの名無しさん :2008/11/01(土) 20:27:33
下のように、 IList<IList<int>> という風にリストを二重にしてはいけないんでしょうか? エラー CS1503: 引数 '3': 'System.Collections.Generic.List<System.Collections.Generic.List<int>>' から 'System.Collections.Generic.IList<System.Collections.Generic.IList<int>>' に変換できません。 というエラーが出ますが、どうしてでしょうか? 一つ目の引数にはエラーが出ません。 public class neko { IList<int> ageValue; IList<IList<int>> sageValue; public neko(IList<int> age, IList<IList<int> sage) { ageValue = age; sageValue= sage; } } public class inu { neko process() { List<int> ageTmp = new List<int>(); List<List<int>> sageTmp = new List<List<int>>(); 〜略 return new neko(ageTmp, sageTmp); ←ここでエラー } }
List<List<int>>はIList<List<int>>としては扱えるけどIList<IList<int>>としては扱えない sageTmpの型をList<List<int>>ではなくList<IList<int>>にすればいい C#4.0ではIEnumerable<List<int>>がIEnumerable<IList<int>>として扱えたりするらしいけど その例ではC#4.0になってもたぶん無理
955 :
953 :2008/11/01(土) 21:15:00
>>954 ありがとうございました。教えていただいたとおりにしたらコンパイルは通りました。
ただどうしてなのか理由がわからないので
>>1 に従い勇気を持って再度質問します。
・どうしてList<IList<int>>にするとコンパイルを通るのか?できるだけ噛み砕いて教えてほしいです。
・IListとListの違いはなにか?
>>953 はとあるサンプルコードを引用したものですが、どうしてnekoのメンバをIListでもっているのか?
Listではダメなのか?
そもそもIListはインターフェースではないのか?(インターフェースのクラスに値を保存できるのか?)
以上、よろしくお願いします。
List<T>はIList<T>を継承してるからIList<T>型として扱える。 だからList<List<T>>が継承しているのはIList<List<T>>で、IList<List<T>>型として扱える。 C#ではジェネリックの型パラメータ(<>内に指定するやつ)が異なるとそれぞれ別の型とみなされる。 そのため、IList<List<T>>とIList<IList<T>>は別の型だから互換性がない。 IList<T>で持ってるとList<T>だけじゃなくてIList<T>を実装してる型のオブジェクトならなんでも 持てる(Tの配列とか)
言語がバージョンアップするってのが受け入れられない それは広辞苑にチョベリグという語句が列記されてしまうのと同じことのように思える それは世間ではチョベリバな出来事では無いだろうか
>>956 超わかった!
ような気がする!
ありがとうございました。
>>956 配列みたいに共変性がないという理解でいいのかな
うん C#4.0では制限付きで共変性と反変性が導入されるらしい
>>960 まだそんな細かいところで改良が続くんだ。
しかし勉強嫌いな俺にはちょっとありがた迷惑気味だなw
2.0の機能だってまだ完全に使いこなせるわけじゃにのに。。
細かいところどころか、動的型とか省略可能引数とかまた大改造だよ 将来的にはメタプログラミングを視野に入れてるとかw
>.NET Framework Version 2.0 以降では、現在読み込まれているランタイムよりも >バージョン番号が新しい .NET Framework のバージョンでコンパイルされたアセンブリを、 >ランタイムが読み込まないようになりました。 >これに該当するのは、バージョン番号のメジャー部分とマイナー部分を組み合わせた番号です。 これは2.0だけで正常に動作するプログラムを3.5でコンパイルすると 必要のないランタイムまで呼び出されてパフォーマンスの低下に繋がるということですか?
>>963 1.1しかインストールされていない環境で2.0のアセンブリを実行すると、
そのまま実行されて転ける。
2.0までしかインストールされていない環境で3.5のアセンブリを実行すると
警告を出して終了する。
ランタイムよりも新しいバージョンで作られたアセンブリは、たとえマイナー
バージョンの差異であっても実行されない。
ってことじゃないの?
つまりどちらにせよランタイムは全て起動されるわけですか その上にモノがあるかないかの違いだけで
.NET2.0が出たときの文書なので「.NET Framework のバージョン」は 「ランタイムのバージョン」に読み替える必要がある。 .NET3.5のランタイム(CLR)は.NET2.0の2.0.50727と同じもの。 .NET3.5のC#3.0でコンパイルしても追加されたアセンブリを参照していない限り.NET2.0の環境で動く。
3.5のコンパイラの方が優れてるんですよね?
> Application.SetCompatibleTextRenderingDefault メソッド Program.csにあるな > 型 : System.Boolean > 新しいコントロールに適用する既定値。 > true の場合、UseCompatibleTextRendering をサポートする新しいコントロールは、テキスト表示用の GDI を使用し、 > false の場合は、GDI+ を使用します。 初めからApplication.SetCompatibleTextRenderingDefault(false);と書いてあったからGDI+を使ってるんだな 名前的にもGDI+はGDIより良さそうだし親切だな > 解説 > 特定の Windows フォーム コントロールでは、GDI グラフィックス ライブラリまたはより新しい GDI+ ライブラリのいずれを使用してもテキストを描画できます。 > このように変更されたのは、GDI+ にパフォーマンスとローカライズに関する問題があるからです。 > 既定では、UseCompatibleTextRendering プロパティをサポートする既存のコントロールは、下位互換性を確保するために true に設定されますが、 > Windows フォーム 2.0 以降に含まれるすべてのコントロールでは、このプロパティは一様に false に設定されます。 > 新しいコントロールの既定のテキスト描画方法を切り替える場合は、SetCompatibleTextRenderingDefault を使用します。 / ̄ ̄ ̄\ / ─ ─ \ / <○> <○> \. | (__人__) | \ ` ⌒´ / / \
WPFを使えという事ですね
ジェネリクスで定義した二次元配列をバイナリファイルに書き込みたいのですが、どうしたらよいのかわかりません。 どなたか教えて下さい。
>>968 GDI+は常にソフトウェア処理。
一方のGDIは、Vista DWM環境以前なら一部ハードウェアアクセラレーションがある。
972 :
デフォルトの名無しさん :2008/11/03(月) 00:45:16
環境変数を正しくいじってないから。
コンソールが開いたままで環境変数の変更が反映されてないとか
;C:\WINDOWS\Microsoft.NET\Framework\2.0.50727 これを追加したんですが、何かまずかったでしょうか。
>>974 ドキッとしましたが、違いました。ちゃんとOK押しました。
;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 うちのはこうだな
コンソールを開きなおさないと反映されないってことかと。
>>973-978 解決しました。ありがとうございました。
原因はコンソールの開きなおしてなかったからですorz
とりあえずpathって打ってみればいいよ。
テキストを読み込んで改行で配列にわけたあと、 空行を条件として書く場合、 if (Regex.Match(line,"^$").Success) if(line.Contains("^$")) if(line.Contains("")) とかを試したのですが、うまくいきません。 空行ってどう書けばいいですか? あと、空行以降の行をまとめてひとつのstringにしたいのですが、 if(空行があったら) { wordFlag = true; string lines = (String.Concat(lines)); lineNumber++; } でできますか?
ぶっちゃけ俺は.NET2005からプログラムの勉強は一切しなくなったよ。 ぶっちゃけプログラム言語の機能が強化されたとしても実行スピードにそれ程大差が あるとは思えない。 なのに言語が4.0とかに進化したからといってその辺を勉強する意味ってあるのかな?
そうして人は老けて行くのですね
>>983 lineがstring型なら
if ( line == String.Empty ) { }
勉強やめたところでプログラマとしては終わり。
いや、社会人として(ry
そもそも社会人じゃない可能性大
スレ統合の話はどうなったw
そういや、そんな話もあったなぁ・・。
あっちは初心者に厳しいような気がするし、このままでいいんじゃね?
やってることは一緒だし回答する奴も一緒だし 分ける必要なんてありゃしない
>>990 乙
どちらもスレの消費は速いからこのままでいいと思う。
どこかで議論してそういう方向なのかと思ったら、毎回次スレが立つとごねる奴が出没してるだけだな。
議論にならんよ、機械的に馬鹿がスレ立ててるだけ 中身が一緒のものを分ける必要性が無い 消費が速いとか関係無いし
やれやれ、初心者スレでバカにされてそれを根に持ってるタイプだな
そもそも本スレで馬鹿にされてヤケになって初心者スレを作ったのが始まりだからな いつまで必死こいて初心者スレを保守してんだよ
初心者スレと本スレじゃ倍近く勢いに差がある 実質的な違いがあると見たほうが適切じゃね
具体的に、どこが違うんだよドアホ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。