Progressive tax program Please review this code, which should calculate the tax percentage a person will pay in a progressive tax system. The goal is to have a perfect program.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class TaxLevel
    {
        private decimal _Money=-1;
        /// &lt;summary&gt;
        /// the money count that the tax applies to
        /// &lt;/summary&gt;
        public decimal Money
        {
            get { return _Money; }
            set { if (value &gt; 0) { _Money = value; } else { throw new ArgumentOutOfRangeException("Money must be grater than 0"); } }
        }


        private decimal _TaxDeduction=-1;
        /// &lt;summary&gt;
        /// the tax level where 1.0 is 100% tax
        /// &lt;/summary&gt;
        public decimal TaxDeduction
        {
            get { return _TaxDeduction; }
            set { if (value &gt; 0 &amp;&amp; value &lt; 1.0m) { _TaxDeduction = value; } else { throw new ArgumentOutOfRangeException("TaxDeduction must be between 0.0 and 1.0"); } }
        }

     }

     class TaxCalculator
    {
        List&lt;TaxLevel&gt; _TaxLevels;

        public bool DeterminateTaxLevels(){

            _TaxLevels = new List&lt;TaxLevel&gt;();
            _TaxLevels.Add(new TaxLevel {Money = 4770m, TaxDeduction =  0.10m });
            _TaxLevels.Add(new TaxLevel { Money = 3700, TaxDeduction = 0.14m });
            _TaxLevels.Add(new TaxLevel { Money = 4249m, TaxDeduction = 0.20m });
            _TaxLevels.Add(new TaxLevel { Money = 5529m, TaxDeduction = 0.28m });
            _TaxLevels.Add(new TaxLevel { Money = 21089m, TaxDeduction = 0.31m });
            _TaxLevels.Add(new TaxLevel { Money = decimal.MaxValue, TaxDeduction = 0.42m });
        return true;
        }
         /// &lt;summary&gt;
         /// Gets Salley In Bruto Calculates Netto Sallery
         /// &lt;/summary&gt;
         /// &lt;param name="SalleryInNis"&gt;Employee Bruto Sallery&lt;/param&gt;
         /// &lt;returns&gt;Neto Sallery&lt;/returns&gt;
        public  decimal CalculateNetto(decimal SalleryInNis)
        {
            if (SalleryInNis &lt; 0) throw new ArgumentOutOfRangeException("SalleryInNis must be greater than 0");
            if (_TaxLevels == null) throw new ArgumentNullException("DeterminateTaxLevels First");
            decimal TmpSallery =SalleryInNis;
            decimal Netto = 0.0m;   
            foreach (var taxlevel in _TaxLevels)
            {
                if (TmpSallery &lt;= 0) break;
                if (TmpSallery &gt; taxlevel.Money)
                {
                    Netto += taxlevel.Money * (1-taxlevel.TaxDeduction);         
                }
                else {
                    Netto += TmpSallery * (1-taxlevel.TaxDeduction);
                }
                TmpSallery -= taxlevel.Money;
            }
            return Netto;
        }
         /// &lt;summary&gt;
         /// Calculates Average Tax for employee
         /// &lt;/summary&gt;
        /// &lt;param name="SalleryInNis"&gt;Employee Bruto Sallery&lt;/param&gt;
        /// &lt;returns&gt;AverageTax&lt;/returns&gt;
        public  decimal CalculateAverageTax(decimal SalleryInNis)
        { 
            if (SalleryInNis &lt; 0) throw new ArgumentOutOfRangeException("SalleryInNis must be greater than 0");
            return 1- (CalculateNetto(SalleryInNis) / SalleryInNis);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            decimal Sal= 11712000;
            TaxCalculator TaxCalculator = new TaxCalculator();
            TaxCalculator.DeterminateTaxLevels();
            Console.WriteLine("Brutto " + Sal);
            Console.WriteLine("Netto " + TaxCalculator.CalculateNetto(Sal));
            Console.WriteLine("Average Tax " + TaxCalculator.CalculateAverageTax(Sal));
            Console.Read();
        }
    }
}
If something is mandatory then use private setters and constructor arguments, and validate in the constructor (TaxLevel) [1];
Use collection initializer notation [2];
DeterminateTaxLevels should be private and called from the constructor (I would actually make it a simple attribution in the constructor);
DeterminateTaxLevels should have a better name like LoadTaxLevels, because it does not &quot;determine&quot; anything;
DeterminateTaxLevels has no reason to return bool - why does it?;
Salary is misspelt;
Either call the salary &quot;bruto&quot; or &quot;in Nis&quot; - you should be consistent, and I advise &quot;bruto&quot; because it means more than some random TLA like NIS (whatever it is);
As @Gene S said, try to follow coding standards: use brackets in ifs, use line-breaks after ifs, use camelCase on parameter names and not PascalCase, etc...


footnotes
[1]:
private class TaxLevel
{
    /// &lt;summary&gt;
    /// The money count that the tax applies to.
    /// &lt;/summary&gt;
    public decimal Money { get; private set; }
    /// &lt;summary&gt;
    /// The tax level where 1.0 is 100% tax.
    /// &lt;/summary&gt;
    public decimal TaxDeduction { get; private set; }
    
    public TaxLevel(decimal money, decimal taxDeduction) {
        if (money &lt; 0 ) {
            throw new ArgumentOutOfRangeException(&quot;Money must be grater than 0&quot;);
        }
        if (taxDeduction &lt; 0 || taxDeduction &gt; 1.0m) {
            throw new ArgumentOutOfRangeException(&quot;TaxDeduction must be between 0.0 and 1.0&quot;);
        }
        Money = money;
        TaxDeduction = taxDeduction;
    }
}

[2]:
_TaxLevels = new List&lt;TaxLevel&gt;() {
    new TaxLevel {Money = 4770m, TaxDeduction =  0.10m },
    new TaxLevel { Money = 3700, TaxDeduction = 0.14m },
    // ...
    new TaxLevel { Money = decimal.MaxValue, TaxDeduction = 0.42m },
};