ふらっと C#,C♯,C#(初心者用) Part138
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■関連スレ
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part137
https://mevius.5ch.net/test/read.cgi/tech/1523004019/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured digisparkというのを使ってたけどHIDデバイスに見えて入出力OK
昔は300円以下で送料無料で中国から買えたんだけど値上がりしちゃった C♯でMySQLを操作したいのですが楽に扱えるライブラリはありますか?
EntityFrameworkを使いたいのですがイマイチ接続できないので
一応昔にSQL書いて操作するパターンも作ったことありますが出来ればせっかくなのでやり取り楽な風にできればと思ってます ありがとうございます
Dapperの存在忘れてましたこちら使い方少し調べてみます
LinqConnectも調べましたが環境整えるところからなので余裕ができたらこちらも調べてみます 教えてください
Power1とPower2はxのn乗を求める関数だそうなのですが
なぜPower2がxのn乗になるのかさっぱり分かりません
しかもPower2の方がPower1よりも効率がいいらしいです
よろしくお願いします
double Power1(double x, uint n)
{
double power = 1;
while (n > 0)
{
power = power * x;
n = n - 1;
}
return power;
}
double Power2(double x, uint n)
{
double power = 1;
while (n > 0)
{
if (n % 2 == 1) power = power * x;
x = x * x;
n = n / 2;
}
return power;
} double power = 1.0;
の方が効率がいいぞ >>471
高校数学やん
x^(a +b) = x^a + x^b
x^(a * b) = (x^a)^b >>471
これでわかるか?
x^n = {
nが2で割り切れるとき x^(n/2) * x^(n/2)
割り切れないとき x^((n-1)/2) * x^((n-1)/2)
} すまん訂正
割り切れないとき、はこれにxを掛けてくれ >>473
ん゛?
× x^(a +b) = x^a + x^b
〇 x^(a +b) = x^a * x^b >>472
ありがとうございます
定数だけの四則演算やキャストはコンパイルの時点で行われるから
効率に影響は無いと習ったのですがこの場合は違うのですね
キャストがコンパイル時と実行時のどちらで行われるかを判断する
簡単な方法があれば教えてほしいです
>>473 >>476
ありがとうございます
指数法則が関係あるのですね
これをヒントにもう一度考えてみます
>>474-475
ありがとうございます
教えてもらったことをヒントに再帰を使ってxのn乗を作ってみたのですが
この関数はあってますか?
でも、やっぱりなぜPower2がxのn乗になるのかよく分かりませんでした
double Power3(double x, uint n)
{
if (n == 0) return 1;
else if (n % 2 == 0) return Power3(x, n / 2) * Power3(x, n / 2);
else return Power3(x, (n - 1) / 2) * Power3(x, (n - 1) / 2) * x;
} >>477
こうじゃない?
いい加減に書いたから間違ってたらごめん
double Power(double x, uint n)
{
if (x == 0) return 0;
if (n == 0) return 1;
if (n == 1) return x;
return n % 2 == 0 ? Power(x * x, n / 2) : Power(x * x, n / 2) * x;
}
要するに、
x^(a + 1) = x^a * x
x^(2 * a) = (x * x)^a >>478
ありがとうございます
そのPowerを再帰を使わずに書くと>>471のPower2になるということですか?
なんだか分かりそうな気がしてきたのでその方向でもう一度考えてみます! お陰様で>>471について理解できたと思います
どうもありがとうございました!
>>480
言われてみると、>>471のPower1やPower2では0の0乗が1になりますが
>>478のPowerだと0の0乗が0になりますね
調べてみたらWikipediaに「0の0乗」というページがあって
確かに0の0乗を1と考えることが多いと書いてありましたが
それ以外の考え方もあるみたいです 0乗が1以外になる考え方なんてあるんだ
単位元の1に何も掛けないんだから常に1だと思ってた >>471の件ではどうもありがとうございました
もう一つ質問させてください
以下のPopulation1とPopulation2は同じ結果になるそうです
Population1は>>471のPower2によく似てるので
これは指数計算の変形だと思うのですが、
Population2でも同じ結果になるのが理解できません
何度もすみませんがよろしくお願いします
uint Population1(uint n)
{
uint population = 0;
while (n > 0)
{
if (n % 2 == 1) population = population + 1;
n = n / 2;
}
return population;
}
uint Population2(uint n)
{
uint population = 0;
while (n > 0)
{
population = population + 1;
n = n & n - 1;
}
return population;
} >>482
確かにWikipediaによれば
半群Sが単位元1をもつならSの元aの0乗は1になるので
Sが零元0ももつなら0の0乗は1になるそうです・・・なんのこっちゃw
>>483
ありがとうございます
Power2はちゃんとした名前のついたアルゴリズムだったんですね
この分だとPopulation2にも名前がついてそうですが
それらしい情報を見つけることができなかったので
もしご存知だったら教えてもらえると嬉しいです >>484
面白いねw
要は1が立ってるビットの数を数えてるわけだと思うけど、
Population2の方は
>n = n & n - 1;
これやると1が立ってる最下位ビットが消えるんだなw
名前は知らないごめんね >>486
ありがとうございます
ビット演算については分かってるつもりだったのに全然でした・・・
ヒントを貰って下のようなプログラムを試してみたら
確かに最下位ビットが順に消えていって感動です
uint n = 4649;
while (n > 0)
{
Console.WriteLine(Convert.ToString(n, 2));
n = n & n - 1;
}
【実行結果】
1001000101001
1001000101000
1001000100000
1001000000000
1000000000000
でも結局n = n & n - 1;で最下位ビットが消える理由が
理解できていないのでもう少し考えてきます >>487
デクリメントした時、
(1) ボローが発生しなくなる桁(つまり、最下位の1の桁)はデクリメントの前は1、後は0
(2) その下位の桁はデクリメントの前は0、後は1
(3) 上位の桁の値は変わらない
なんだから、前後の値の論理積は必ず最下位の1まで0になる >>488
とてもわかり易い説明ありがとうございます!お陰様で理解できました
実はこの説明を読むまでn & n - 1は(n & n) - 1という意味だと思ってて、
それならn - 1と同じじゃないのかと思いながらも
トンチンカンなことを言ってしまうのが怖くて黙ってたのですが、
こんなことなら変なプライドは捨ててさっさと疑問をぶつければよかったです
この問題を考えていて、少しビット演算に慣れてきた気がします
使い道があるかどうかは分かりませんが、
n = n & ~(n - 1);だと逆に最下位ビット以外を消すことができるんですね
とにかく、どうもありがとうございました 今更ですがPopulationってビットの人口ってことだったんですね・・・
Wikipediaにもページがバッチリありました
https://en.wikipedia.org/wiki/Population_count C#で予め用意されているクラス(Mathなど)のソースコードを見ることは可能ですか?
勉強がてら、どんな風に書かれているのか見てみたいのですが・・・ >>492
ここにある
ちなみにMathは大部分が直接CLRに組み込まれていてC++で実装されているからあまり参考にはならんぞ
https://github.com/dotnet/corefx さすがに今更 Reference Sources は時代遅れだろ
Coreの方がコンパクトに纏まっててわかりやすいし、コピペしても捕まらないし 他人の書いたライブラリとか使おうと思っても仕様書もどう読めばいいかあまりわからなくて
いつも他人様の書いたコード見てやっとなんとなく使い方理解できてるんですが
サラサラかける人はどういう見かたしてるんですか?サンプル見てメソッド見ればもうわかるのですか? >>496
ソースのメソッド見て中身理解するのは仕様書読むよりも難しくないか
メジャーなライブラリなら例を書いているサンプルがネット上にいっぱいあるし
そうでなくてもある程度自分で試しながら理解したらいいと思うが >>496
サンプル見ればだいたい分かるよ
お前も新しいフリーソフトとかWebサービスとか使うときマニュアル見なくてもだいたい分かるだろ?
それでお前の母ちゃんや友人に何で分かるのか聞かれて何て答える?
それと同じことで、経験を積むとパターンやライブラリの作者の考えが読めるようになってくる 簡単だよ
こういう処理がしたいならメソッドにこういう文字列が含まれてるはずだよな
インテリセンスカチャカチャほらみろ有ったぞ
次は引数をドキュメントコメントで調べて入力
コンパイルエラー消えたよしこれでオッケー
ビルドして起動したら…はい動いたおわり
だいたいこんな感じ
今はライブラリも開発環境も優秀すぎて楽だよほんと LINQ使った最近のデザパタ紹介しているサイトや書籍ってある?
どこもなんか古いコードで >>501
linqの古いコードって、例えばどんなん?ラムダ使ってない奴のことかな? 性懲りもなくよう相手にするなあこのクサレ脳みそども 他のスレでデザパタと略す奴は例外なくクソって言う風潮があるから
その略称は使わないほうがいいw LinqというかDBアクセス系のパターンの事ならリポジトリパターンやイベントソーシング・CQRSあたりかな
MSの黒本 C#実践開発手法 はどうだろう
あとRxも押さえとけば 名前付きパイプでプロセス間通信するとき、できるだけ遅延を小さくするためにすべきこと、したほうがいいことがありますか? ポータブルなASP.NET実行環境はありますか?
勝手にソフトインストール出来ない環境で使いたい為、Tomcatのように、設定ファイルで設定してexe起動するだけのタイプを探しています。 >>509
.NET CoreとASP.NET Core
SCDでデプロイして内蔵サーバーのKestelで動かす
CoreはMVC系なので509が知っているASP.NETとは別物かもしれないが formが3つがあってそれぞれ仮にa,b,cとして、a,b,cの中にコンボボックスがいくつかあってaのコンボボックスの一つにエクセルをdbで読み取って?コンボボックスに値を入れました。
以降もコンボボックスに入れてくんですけど、違いがブック名とシート名でコードをまとめたい時はどこにどのように書けばいいですか?
今はform aのloadに一つ書いてます。 class Configurations { 各コンボボックスに入れるべき値をそれぞれプロパティとして定義 }
interface IConfigurationsSource { Configurations GetConfigurations(); }
class ExcelConfigurationsSource : IConfigurationsSource {
private readonly string book;
private readonly string sheet;
public ConfigurationsSource(string book, string sheet) { this.book = book; this.sheet = sheet; }
public Configurations GetConfigurations() { return Excelシートから読み取ってConfigurationsに詰めて返す(book, sheet); }
}
こういうのを作って使い回す クラスを継承して機能を共通化するのとインターフェースで共通化するのと何が違いますか? いろいろなレベルでの回答があるが
インターフェースはMIX可能
継承の濫用は保守困難になりがち
インターフェース意識した方が設計的にスマートな事が多い
c#8で事情は大きく変わるが クラス継承は切り離せないが、インターフェースなら切り離せる。 >>493
即レス感謝です
勉強になります
ありがとうございました >>512
レベルが高過ぎてさっぱりです。
これはクラス追加してクラスに書く感じですかね?
クラス=VBのモジュールって感じでいいんですかね? >>514
> c#8で事情は大きく変わるが
C#8ではnull非許容が標準になるという噂は聞いたことがあるのですが、
この話は検索してみてもなんのことを仰っているのか分かりませんでした
とても興味があるので、ぜひ詳しく教えていただけないでしょうか >>521
インターフェースのデフォルト実装が導入されることかな。
.NET ランタイムにも手が入るそうな。 >>522
レスありがとうございます!
ただこれだけを聞くとC#8でインターフェースの価値が更に上がるように思うのですが、
>>514さんはインターフェースの価値を説かれた上で
「c#8で事情は大きく変わる」と仰っていているので、他の機能に拡充が図られるなどで
インターフェースの価値が相対的に下がると仰っしゃりたいように感じました
実際にはそういうわけではないのでしょうか?
いずれにしても、インターフェースのデフォルト実装は便利そうで楽しみです
あと、それほどいろいろと手を入れるなら、
IList<T>が共変なIReadOnlyList<out T>と反変なIWriteOnlyList<in T>を
継承するようにするとか、そういう変更もあると嬉しいな〜と素人ながら思ってみたりw >>523
IWritableListとIReadableListみたいな名前ならともかく、
それじゃわざわざOnlyって強調した単語使ってる意味がなくなるから悪手だろ >>525
既にList<>はIReadOnlyList<>を実装してるんだから今更だろ。
IList<>がIReadOnlyList<>を継承できない理由は、インターフェイスメンバの明示的実装を壊すから
IList<>に宣言されてたメンバのうちIReadOnlyList<>と被るものを全部削除したとしたら、IList<>のメンバを明示的実装している既存のクラスが全滅する 誤解を与えてすまん
c#8でインターフェースのデフォルト実装がサポートされるので価値は高まるという認識でok
null不許容も含めて大きく変わるねえ null非許容を乱暴に説明すると
参照型の変数にnullが入らないのがデフォになる。よって多くのシナリオでnull落ちになるケースが激減する。基本的にプログラミングが楽になる。
変数にnull許可する場合には明示的に宣言が必要になる。
既存のソースに対しては破壊的変更になるからコンパイルオプションとかになるんじゃないかな。 OOP的にも綺麗でテーブルが正規化されてればnull非許容は受け入れられるかもね
業務システムではあまり役に立たなそうだ >よって多くのシナリオでnull落ちになるケースが激減する。基本的にプログラミングが楽になる。
岩永氏の例の記事にもそう書いてあるが、何度考えてもこれは逆だと思うなw
いわゆる「例外を握りつぶす」筋悪コードと同じ弊害をもたらすだけだろう 凄まじい列数でほとんどがnullのテーブル
あれをなんとかしないとアプリケーションからnullを排除することは難しい
インフラの問題だからホスト言語のちょっとした改善でどうにかなるものじゃない 最近の言語がそういう流れだからだろうね
DB絡みに外部結合やORM、既存ライブラリやサービスがある以上、null考慮は回避できないだろうから使い分けになるだろうね
nullまみれのテーブルも いまだにみかけるし
新規コードでサクサク組んでいくには便利やと思う >>525
レスありがとうございます
確かに、ReadOnlyという言葉がIReadOnlyList<>を継承するものにかかっていると考えると
IList<>がIReadOnlyList<>を継承するのは妙な感じですね
ただ現実として、>>526でも指摘していただいているようにList<>はIReadOnlyList<>を
実装していますので、ReadOnlyという言葉はあくまでIReadOnlyList<>自身にかかっていると
とらえてしまってもいいのかなと考えています
その現状の言葉遣いが間違っているのだから直すべきだというご主張なら、
実現可能性は私には難しくて分かりませんが、とても興味深いご意見だと思います
>>526
レスありがとうございます
書いていただいた文章を読むと、インターフェースは継承元のインターフェースと
同じ名前のメソッドを持てない、もしくはインターフェースの明示的実装に悪影響があると
考えていらっしゃるように見受けられたのですが、この部分がよく理解できなかったので
申し訳ないのですが詳しくご説明していただけるとありがたいです
>>527-528
レスありがとうございます
私の方こそ、変な深読みをしてしまい失礼しました
私は初学者なので機能の増強は単純に楽しみなのですが、
既存のソースを多くお持ちの方にとっては大幅な変更はいいことばかりでもないのですね
>>528-531
興味深いお話をどうもありがとうございます
自分からnull非許容の話を出しておいて恥ずかしいのですが、
実はこれが具体的にどういうものなのかほとんど理解できていないのです
var a = new string[1]; は許されるのか?とか、許されるならそれは
var a = new string[1] { string.Empty }; と同じ意味なのか?とか、
もしそれが正しいなら、クラス毎に Empty 的なものを用意しないといけないのか?とか
疑問は膨らむばかりです シンプルなコードで良い疑問やなあ
実際導入されたら混乱しそう…
右辺のArrayがnullを許さないからコンパイラに怒られそう
初期値入れたらいけそう
もし仮にstringの規定値がemptyになる仕様になれば初期化無しでもコンパイルとおるかも
c#7系以前と同じ挙動にするなら
var a = new string[1]?;
という記述になるはず
List系使うから配列を生で使う機会は減ったけどね C#の話じゃないかもしれませんが、
LAN上の他のPCと通信するにはTCPorUDPしかないですかね?
ポート開けようとすると管理者のパスワード要求されるので
そういうのに影響されない方法があれば教えてください
サーバー上にファイル作って共有しようかとも思ったのですが
ロックとか速度とかちょっと使いにくいので インターネットに出れるんならAWSでSQSかKinesisでも使えば レイヤー無視なら
Multi-object Multi-lingual Document Intermediary の仕様書でも >>536
TCPやUDPじゃないと関所を通れないからなぁ ポート開けたくないな、名前付きパイプのRemotingは?
sambaのポートが開いてりゃ疎通できた気がする。 >>536
> ポート開けようとすると管理者のパスワード要求されるので
要するになんか管理者に知られずき通信したいんだろ
悪事に加担する気はない アホか
くだらないことを書き込む前に少しは推敲しろ ありがとうございます
まずは名前付きパイプを調べてみます バイブにたかしとかりょうとか名前付けて愛用してんのかなぁ… >>534
レスありがとうございます
>右辺のArrayがnullを許さないからコンパイラに怒られそう
>初期値入れたらいけそう
確かにそんな気がしますね
でもそうなると大きな配列とは相性が悪そう・・・
>もし仮にstringの規定値がemptyになる仕様になれば初期化無しでもコンパイルとおるかも
それが一番わかりやすそうですね
ただ、stringはともかくStringBuilderの規定値とかどうすればいいのかさっぱり見当がつきません
>c#7系以前と同じ挙動にするなら
>var a = new string[1]?;
>という記述になるはず
?の位置は[1]の前ですか?
まあ書き方はともかく、もしvar a = new StringBuilder[100];とすると
自動的に100個のStringBuilderのインスタンスが作られるなら、
そのような動作を望まなければ配列の要素の型はnull許容にしたほうが良さそうですね
そうすると、例えばジェネリック型を使うときにはstringのような型とStringBuilderのような型の
区別をつけたくなることもありそうですし、ジェネリック型制約に新しく
where T : immutable(intやstringは許すけどStringBuilderは許さない)が
追加されたり・・・とか妄想してみましたw プログラム素人で恐縮ですが、for文のスコープの中に変数を宣言するとメモリの無駄使いになるでしょうか?
for(;;) int hoge =1;
のような書き方です
for文に入る前に宣言した方が作法的に良いのであればそうしたいと思い コンパイラが最適化するのじゃないか?
初心者は、そんな事を考えずに、なるべく狭いスコープで宣言した方が良い。
処理に、10秒以上掛かるのなら、その時に考えても良いけど
「Effective 何々」などの本を読むと、書いてあるかも知れないけど >>550
C系の言語では基本的に一箇所で宣言された変数はメソッド全体で一つしか作られない
C#の場合はクロージャが絡んだりすると変わってくるけど、基本的にはそういう思想で設計されてる
気にせず必要最小限のスコープで宣言せよ >>545-546
そんなレスしかできないからお前は🙅なんだよ w >>550
IL見ればあなたの悩みは全て解決しますよ あーでも>>550みたいな書き方すると突っ返されるメーカーあるよな。
無駄な作業させてるって自覚無いんだろうかなぁ >>550みたいな書き方してるコードってたいてい他の部分もクッソ汚いから、とりあえず突き返すのはわりと賢明なやり方 スコープ毎にスタック操作なんかしないし、汚くてもオプティマイズされたら面影も無いし、イジメでしか無い罠 var すら毛嫌いされちゃうとこなのでコードレビューなんかやったらストレスで禿げるわ それぞれのコーディング規約に従えばいいんじゃないですか >>555
さすがに>>550のコードは例としてはあれだが
C#でforの中でしか使わん変数をforの外で定義しろと?
どんなメーカーだよ。つかメーカーってなんのメーカーだよ C#8のデフォルトインターフェースメソッドって、
インターフェースでほぼコーディングを終わらせてしまうことも可能、
って解釈で良いのかな。 クエリとlinqとlinqToXmlの違いがなにかよくわからないです
これらはなんですか
クエリはfromやselectとか思ってたのですが
"from a 〜 select a"も "XXXXXX.Select(〜)" の両方ともクエリ?
linqの中にクエリがある感じですか?
用語の違いを知りたいです >>561
C組込上がりが閑職で社内システムを任されるとありそう
関数の先頭で宣言しろ宣言 ■ このスレッドは過去ログ倉庫に格納されています